无法推送到Bitbucket上的Git存储库

我创build了一个新的存储库,并且遇到了一个奇怪的错误。 我以前在Bitbucket上使用Git,但是我只是重新格式化,现在我似乎无法让Git工作。 做完提交后,我不得不把我的电子邮件和名字添加到全局variables中,但是这样做确实很好。

当我尝试使用该命令

git push origin master 

它不工作。 我得到这个消息:

 $ git push origin master Permission denied (publickey). fatal: Could not read from remote repository. Please make sure you have the correct access rights and the repository exists. 

我在这里不知所措 我与我分享这个存储库的朋友,访问它很好,并推到它很好,但我似乎无法得到它的工作。

为那些刚刚开始使用Windows的Git和BitBucket的人编写这个文档,并且不熟悉Bash(因为在search问题中的错误消息时这是一个常见问题和高排名的Google结果)。

对于那些不介意使用HTTPS的用户以及正在寻求快速修复的用户,请滚动至此答案的底部,以获取“ FOR THE LAZY”

对于那些希望解决实际问题的人,请按照以下说明操作:

尽可能快地修复SSH问题

这是由VonC链接到的URL的一组指令。 它被修改为尽可能有弹性和简洁。

  • 不要input$或任何不以$开头的行( $表示这是你input到GitBash中的东西)。

  • 打开GitBash

设置您的全球信息,如果你还没有:

 $ git config --global user.name "Your Name" $ git config --global user.email "you@example.com" 

检查OpenSSH:

 $ ssh -v localhost OpenSSH_4.6p1, OpenSSL... 

看到这样的事情?

  • 是:继续。
  • 否:跳到FOR THE LAZY部分或按照VonC链接的文章。

看看你是否已经生成了密钥:

 $ ls -a ~/.ssh/id_* 

如果有两个目录,则可以跳过下一步。

 $ ssh-keygen 

将所有内容保留为默认值,input密码。 你现在应该看到这个命令的结果:

 $ ls -a ~/.ssh/id_* 

检查现有的configuration文件:

 $ ls -a ~/.ssh/config 

如果你得到一个结果,检查这个文件的错误信息。 如果不存在文件,请执行以下操作:

 $ echo "Host bitbucket.org" >> ~/.ssh/config $ echo " IdentityFile ~/.ssh/id_rsa" >> ~/.ssh/config 

确认内容:

 $ cat ~/.ssh/config Host bitbucket.org IdentityFile ~/.ssh/id_rsa 
  • “IdentityFile”之前的单个空格是必需的。

检查每次运行GitBash时启动SSH代理:

 $ cat ~/.bashrc 
  • 如果您看到一个名为start_agent的函数,则此步骤已经完成。
  • 如果没有文件,继续。
  • 如果有一个文件不包含这个函数,那么你处于一个粘滞的状态。 追加到它可能是安全的(使用下面的说明),但它可能不是! 如果不确定,请按照以下说明备份.bashrc或跳到FOR THE LAZY部分。

在GitBash中input以下内容来创build.bashrc文件:

 $ echo "SSH_ENV=$HOME/.ssh/environment" >> ~/.bashrc $ echo "" >> ~/.bashrc $ echo "# start the ssh-agent" >> ~/.bashrc $ echo "function start_agent {" >> ~/.bashrc $ echo " echo \"Initializing new SSH agent...\"" >> ~/.bashrc $ echo " # spawn ssh-agent" >> ~/.bashrc $ echo " /usr/bin/ssh-agent | sed 's/^echo/#echo/' > \"\${SSH_ENV}\"" >> ~/.bashrc $ echo " echo succeeded" >> ~/.bashrc $ echo " chmod 600 \"\${SSH_ENV}\"" >> ~/.bashrc $ echo " . \"\${SSH_ENV}\" > /dev/null" >> ~/.bashrc $ echo " /usr/bin/ssh-add" >> ~/.bashrc $ echo "}" >> ~/.bashrc $ echo "" >> ~/.bashrc $ echo "if [ -f \"\${SSH_ENV}\" ]; then" >> ~/.bashrc $ echo " . \"\${SSH_ENV}\" > /dev/null" >> ~/.bashrc $ echo " ps -ef | grep \${SSH_AGENT_PID} | grep ssh-agent$ > /dev/null || {" >> ~/.bashrc $ echo " start_agent;" >> ~/.bashrc $ echo " }" >> ~/.bashrc $ echo "else" >> ~/.bashrc $ echo " start_agent;" >> ~/.bashrc $ echo "fi" >> ~/.bashrc 

validation文件是否已成功创build(您的应该只在出现“yourusername”的地方):

 $ cat ~/.bashrc SSH_ENV=/c/Users/yourusername/.ssh/environment # start the ssh-agent function start_agent { echo "Initializing new SSH agent..." # spawn ssh-agent /usr/bin/ssh-agent | sed 's/^echo/#echo/' > "${SSH_ENV}" echo succeeded chmod 600 "${SSH_ENV}" . "${SSH_ENV}" > /dev/null /usr/bin/ssh-add } if [ -f "${SSH_ENV}" ]; then . "${SSH_ENV}" > /dev/null ps -ef | grep ${SSH_AGENT_PID} | grep ssh-agent$ > /dev/null || { start_agent; } else start_agent; fi 
  • closuresGitBash并重新打开它。
  • 您应该被要求input您的密码(对于之前生成的SSH文件)。
  • 如果没有提示,你要么没有设置密码或GitBash没有运行.bashrc脚本(这将是奇怪的,所以考虑审查它的内容!)。 如果你在Mac(OS X)上运行这个,默认情况下.bashrc不会被执行 – .bash_profile是。 为了解决这个问题,把这个片段放在你的.bash_profile[[ -s ~/.bashrc ]] && source ~/.bashrc

如果你没有input密码,你可能会在启动GitBash时看到类似这样的内容:

 Initializing new SSH agent... succeeded Identity added: /c/Users/yourusername/.ssh/id_rsa (/c/Users/yourusername/.ssh/id_rsa) 

以下内容应返回结果:

 $ ssh-add -l 

但是,如果从ssh-add -l获得以下内容:

 Could not open a connection to your authentication agent. 

它没有产生SSH代理,你的.bashrc可能是原因。

如果启动GitBash的时候,你会看到:

 Initializing new SSH agent... sh.exe": : No such file or directory 

这意味着你忘了在回显文件时(即扩展variables)使用\来避开$。 重新创build你的.bashrc来解决这个问题。

validation代理正在运行,并且您的密钥已被添加:

 $ ssh-add -l 

应该返回类似这样的东西:

 2048 0f:37:21:af:1b:31:d5:cd:65:58:b2:68:4a:ba:a2:46 /Users/yourusername/.ssh/id_rsa (RSA) 

运行以下命令获取您的公钥:

 $ cat ~/.ssh/id_rsa.pub 

(它应该返回一些以“ssh-rsa ……”开始的东西

  • 点击GitBash窗口图标
  • 点击修改
  • 点击标记
  • 使用鼠标突出显示公钥(包括前导ssh-rsa位和尾随== youremail@yourdomain.com位)
  • 右键单击该窗口(执行复制)
  • 将公共密钥粘贴到记事本中。
  • 删除所有的换行符,这样只有一行。
  • CTRL+A然后按CTRL+A CTRL+C将公钥再次复制到剪贴板。

通过执行以下步骤,使用BitBucketconfiguration您的私钥:

  • 打开浏览器并导航到BitBucket.org网站
  • login到BitBucket.org
  • 点击你的头像(右上angular)
  • 点击pipe理帐户
  • 单击SSH密钥(在左侧菜单的安全下)
  • 点击添encryption钥
  • input标签的Global Public Key
  • 粘贴您从记事本复制的公钥

Global Public Keyinput现在应该在您的密钥列表中可见。

  • 返回到GitBash
  • 进入包含你的项目的目录
  • 将您的起源更改为SSH版本(如果您运行FOR THE LAZY步骤,则不会这样)

检查你的遥控器:

 $ git remote -v 

切换到SSHurl:

 $ git remote set-url origin git@bitbucket.org:youraccount/yourproject.git 

检查是否正在工作:

 $ git remote show origin 

你应该看到这样的东西:

 Warning: Permanently added the RSA host key for IP address '...' to the list of known hosts. * remote origin Fetch URL: git@bitbucket.org:youruser/yourproject.git Push URL: git@bitbucket.org:youruser/yourproject.git HEAD branch: master Remote branch: master tracked Local ref configured for 'git push': master pushes to master (fast-forwardable) 

DONE!

您可以select使用HTTPS而不是SSH。 它将要求您在远程操作期间input密码(键入一次后会暂时caching)。 这里是你如何configurationHTTPS:

对于懒惰

您应该修复VonC所描述的SSH问题; 但是,如果您现在急于提交并且没有工具/时间/知识来生成新的公钥,请将您的起源设置为HTTPS备选scheme:

 > https://accountname@bitbucket.org/accountname/reponame.git 

使用TortoiseGit等GUI工具或命令行工具 。

以下是这个替代原始URL的文档。

如果命令行不存在,则添加命令行:

 git remote add origin https://accountname@bitbucket.org/accountname/reponame.git 

用于更改现有原点的命令行:

 git remote set-url origin https://accountname@bitbucket.org/accountname/reponame.git 

注意:您的帐户名称不是您的电子邮件。

您可能还想设置您的全球信息:

 git config --global user.name "Your Name" git config --global user.email "you@example.com" 

然后再次尝试您的推送(不需要再次提交)

 git push origin master 

如果您忘记将私钥添加到ssh-agent也会发生此错误。 做到这一点:

 ssh-add ~/.ssh/id_rsa 

重新格式化意味着你可能已经删除了你的公钥和私钥(在〜/ .ssh中)。

您需要重新生成它们,并在您的BitBucketconfiguration文件上发布您的公共ssh密钥,如“ 使用 GitBash为Git设置SSH ”一文中所述, 使用“与Bitbucket协同使用SSH协议 ”。

帐户 – >pipe理帐户 – > SSH密钥:

http://solvedproblems.hydex11.net/_media/solved-problems/crazy-problems/bitbucket_manage_account.png

然后:

http://solvedproblems.hydex11.net/_media/solved-problems/crazy-problems/bitbucket_add_ssh.png

“ 集成Mercurial / BitBucket与JetBrains软件 ”

我通过删除远程使用命令解决了这个问题:

 git remote remove origin 

然后尝试使用https url而不是ssh添加远程

 git remote add origin httpsUrl 

它要求github凭据。 input凭据,然后尝试使用以下命令推送到git:

 git push origin master 

我有同样的问题。 我的SSH密钥设置正确。 我解决了这个问题。

在Bitbucket中创build新项目后,使用clone。 在terminalinput克隆命令,它应该克隆空的项目到您的计算机。 之后,你可以复制你的文件到这个目录,并开始提交并推送到bitbucket。

两个小澄清,可能会救一个人我所经历的困惑:

1 – HTTPS和SSH的连接URL不同

通过https连接时,可以使用

 https://your_account_name@bitbucket.org/owner-account/repo-name.git 

但是当通过SSH连接时,帐户名称始终是“git”

 ssh://git@bitbucket.org/owner-account/repo-name.git 

试图连接到SSH与您的帐户名在前面将导致错误的原始海报收到。 这是你如何做连接到git @的testing,然后错误地尝试使用你的用户名,并看到一个错误。

2 – 通过团队帐户的SSH密钥将在2017年弃用

如果您在团队帐户上设置SSH密钥,则build议将其切换到个人帐户。 一个有用的提示,以避免e

只需要〜/ .ssh目录下的configuration文件
ref: https : //confluence.atlassian.com/bitbucket/set-up-ssh-for-git-728138079.html
在configuration文件中添加波纹pipeconfiguration

 Host bitbucket.org IdentityFile ~/.ssh/<privatekeyfile> 

对于一个仓库,我得到了这个相同的错误 – 突然间,所有其他仓库在我尝试推送提交时仍然正常工作。 问题似乎与SSH密钥(你已经知道从以前的评论) – 在bitbucket去View Profile然后单击Manage Account

在左侧点击SSH Keys然后在〜/ .ssh /目录下添加你的系统。

如果您还没有生成一个 – 使用其中一个post的说明,但要确保您使用默认的id_dsa.pub文件或自定义的命名文件,稍后需要-i选项和密钥的path当你连接即

 ssh -i ~/.ssh/customkeyname username@ip_address 

一旦你在bitbucket中添加了本地密钥到你的账户,你就可以开始与你的仓库交互了。

我发现最适合我的解决scheme是分解成小块。

并从提交中删除大的截图图像文件(10MB +)

最后,关于bin文件的限制,安全性并不是问题

如果您正在使用SourceTree(我正在使用2.4.1),我发现了一个更简单的方法来生成一个SSH密钥,并将其添加到我的Bitbucket设置。 这解决了我的问题。

  1. 在SourceTree中,转到“首选项”。
  2. 转到帐户标签并select您的帐户。
  3. 应该有一个选项来生成SSH密钥并将其复制到剪贴板。
  4. 一旦你复制了,在你的浏览器中转到Bitbucket。 转到[avatar] – > Bitbucket设置。
  5. 转到SSH密钥。
  6. 点击添encryption钥
  7. 粘贴您复制的密钥。

我收到一封来自Bitbucket的确认邮件,说明SSH密钥已经添加到我的帐户中。

作为参考,在macOS上,使用Terminal,可以使用以下命令查看为您的设备生成的密钥。 这是您生成密钥的地方。

 ls -la ~/.ssh 

正如其他人所说,这个文档帮助我: 与Bitbucket云使用SSH协议

当存储库不存在时,这个错误也会显示出来。 我试了所有的答案,直到我看到回购的名字是缺less一个破折号

对于错误:

[错误] 存取库访问被拒绝。 通过部署密钥访问是只读的。 致命的:无法从远程存储库读取。 请确保您拥有正确的访问权限并存在存储库。

[错误] 致命:无法从远程存储库读取。

[错误] 致命的:无法find'https'的远程助手

我解决了以下步骤:

首先安装这个依赖关系:

 $ yum install expat expat-devel openssl openssl-devel 

然后删除git:

 $ yum remove git git-all 

现在在最后的版本上构build并安装Git,在这种情况下:

 $ wget https://github.com/git/git/archive/v2.13.0.tar.gz $ tar zxf v.2.13.0.tar.gz $ cd git-2.13.0/ 

然后进行configuration:

 $ make configure $ ./configure --with-expat --with-openssl 

最后像这样安装:

 $ make $ make install install-doc install-html install-info 

就是这样,现在用https:

 $ git remote add origin https://github.com/*user*/*repo*.git # Verify new remote $ git remote -v 

如果您在远程服务器上configuration了ssh密钥,则必须将其删除。