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


143

我创建了一个新的存储库,但遇到一个奇怪的错误。我以前在Bitbucket上使用过Git,但是我只是重新格式化了,现在似乎无法让Git正常工作。提交后,我必须将电子邮件和名称添加到全局变量,但随后提交就可以了。

当我尝试使用命令

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.

我在这里茫然。我与之共享此存储库的朋友可以很好地访问它并将其推送到正确的位置,但是我似乎无法使其正常工作。


4
您可以在远程网址中使用https而不是gits。如:yourusername@bitbucket.org/teamname/repository.git
阿里

1
我通过密切关注Atlassian的有关如何在计算机上设置SSH的教程来解决了相同的问题:confluence.atlassian.com/display/BITBUCKET/Set+up+SSH+for+Git
sws 2015年

Answers:


229

为那些刚开始在Windows上使用Git和BitBucket以及对Bash不那么熟悉的人(因为这既是常见问题,又是在搜索问题中的错误消息时获得较高排名的Google结果)编写的代码。

对于那些不介意HTTPS并正在寻求快速修复的用户,请滚动至此答案的底部,以获取FOR THE LAZY下的说明。

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

尽快解决SSH问题

这是从VonC链接到的URL派生的一组指令。对其进行了修改,使其尽可能具有弹性和简洁性。

  • 不要键入$或任何不以开头的行$(这$意味着您要在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

将所有内容保留为默认值,输入密码。您现在应该使用以下命令查看结果:

$ ls -a ~/.ssh/id_*

检查现有的配置文件:

$ 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 LAZY部分。

在GitBash中输入以下内容以创建.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

验证文件已成功创建(您只能在显示“您的用户名”的地方有所不同):

$ 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
  • 关闭GitBash,然后重新打开。
  • 应该询问您的密码短语(对于您之前生成的SSH文件)。
  • 如果没有提示,则说明您没有设置密码或者GitBash没有运行.bashrc脚本(这很奇怪,因此请考虑查看其内容!)。如果您是在Mac(OS X)上运行此程序,.bashrc则默认情况下不执行- .bash_profile是。要解决此问题,请将此代码段放入您的中.bash_profile[[ -s ~/.bashrc ]] && source ~/.bashrc

如果您没有输入密码,则在启动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

这意味着在回显文件时,您忘记了使用\来转义$(即变量已扩展)。重新创建您的.bashrc以解决此问题。

验证代理是否正在运行并且您的密钥已添加:

$ 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+C将公用密钥再次复制到剪贴板。

通过执行以下步骤,使用BitBucket配置私钥:

  • 打开浏览器并导航到BitBucket.org网站
  • 登录到BitBucket.org
  • 单击您的头像(右上角)
  • 点击管理帐户
  • 单击SSH密钥(在左侧菜单中的“安全性”下)
  • 单击添加密钥
  • 输入Global Public Key标签
  • 粘贴您从记事本复制的公钥

Global Public Key现在,在键列表中应该可以看到一个条目。

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

检查遥控器:

$ git remote -v

切换到SSH网址:

$ 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)

完成!

您可以选择使用HTTPS而不是SSH。它将要求您在远程操作期间输入密码(一次输入后会暂时缓存)。这是配置HTTPS的方法:

对于懒惰

您应该按照VonC所述修复SSH问题;但是,如果你在赶时间承诺和没有工具/时间/知识生成一个新的公钥现在,请将您的起源到HTTPS选择:

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

使用GUI工具(例如TortoiseGit)命令行工具

这是此备用来源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

echo“ Host bitbucket.org” >>〜/ .ssh.config,不应该最后一个'。' 是'/'吗?
彼得

1
有时,您已经添加了上面提到的所有内容,~/.bashrc但是仍然在运行命令时 ssh-all -l仍然显示No agent 在这种情况下,请尝试使用此命令 ssh-agent /bin/bash,这将Initializing new SSH agent...
shinesecret

5
我在StackOverflow上遇到的最好的答案之一
Sambhav Sharma

1
@JGallardo-好问题!好消息是没有。这些是bash shell脚本中的变量-它们类似于批处理文件中的环境变量。
Graeme Wicksted

1
这不是公认的答案,这让我很伤心。很棒的文章!
ruby_newbie

58

如果您忘记将私钥添加到,也会发生此错误ssh-agent。为此,请执行以下操作:

ssh-add ~/.ssh/id_rsa

4
就我而言,这就是答案,当我创建新密钥时,我总是忘记这一点。
amertkara

1
经过以上发布后,这对您有所帮助
Tony Merritt

它对我有用:),但是您需要确保本地目录中已经有ssh私钥,并且在您的bitbucket帐户中已经注册了公钥
Daniel

25

重新格式化意味着您可能删除了公用和专用ssh密钥(在〜/ .ssh中)。

您需要重新生成它们,然后将公共ssh密钥发布到BitBucket配置文件中,如“ 在Bitbucket上使用SSH协议 ”中“ 在GitBash上为Git设置SSH ”中所述。

帐户->管理帐户-> 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软件集成 ”的图像


7
只是要添加一点。确保如果使用BitBucket(如屏幕截图所示),则将SSH密钥添加到帐户的SSH密钥(帐户->管理帐户-> SSH密钥)。通过“存储库设置”将其添加为部署密钥将仅允许将该密钥用于只读操作(不提交)。
welshk91 2015年

@ welshk91我同意。我修改了答案以添加更多详细图片。
VonC 2015年

1
@VonC-感谢您发布此信息。我一直在努力使它在Windows机器上运行,但徒劳无功,这终于成功了。谢谢,本
ben18785 '16

21

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

git remote remove origin

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

git remote add origin httpsUrl

它要求提供github凭证。输入凭据,然后尝试使用以下命令推送到git:

git push origin master

1
这帮助了我。这是我的正确答案。谢谢
binsnoel

这个对我有用。我没有删除原点,只是添加了一个新的
-shintaroid

感谢您的直接回应。就像魅力一样工作-正是我想要的。
亚历山德拉

4

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

在Bitbucket中创建新项目后,请使用克隆。在终端中输入克隆命令,它将空项目克隆到您的计算机。之后,您可以将文件复制到此目录,然后开始提交并推送到bitbucket。


1
多奇怪。我今天遇到了与OP相同的问题,但没有重新安装或进行任何系统更改,我的钥匙就可以了。该git remote add过程今天不起作用-尝试推送时出现auth错误-但删除.git,然后使用git clone并重新复制我的源代码(只是README.md),可以正常工作。谢谢拉斐尔-如果没有您的回答,我当然不会想尝试一下。
克里斯,2016年

很高兴这个解决方案对您有所帮助
拉斐尔

1
感谢您的回答。我能够通过仅创建一个新目录并克隆到该新目录来解决此问题。 mkdir /tmp/JUNK; cd /tmp/JUNK; git clone ...; cd ..; rm -rf JUNK
Red Cricket

4

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

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

1
你救了我的命!
Alecs

2

两项小小的澄清可以免除我经历过的困惑:

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 @的测试的方法,然后错误地尝试使用您的用户名并看到错误。

2-通过团队帐户使用的SSH密钥将于2017年弃用

如果要在团队帐户上设置SSH密钥,则他们建议将其切换为个人帐户。避免e的有用技巧


1

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

  1. 在SourceTree中,转到“首选项”。
  2. 转到“帐户”标签,然后选择您的帐户。
  3. 应该有一个选项可以生成SSH密钥并将其复制到剪贴板。
  4. 复制完后,在浏览器中转到Bitbucket。转到[头像]-> Bitbucket设置。
  5. 转到SSH密钥。
  6. 点击添加键
  7. 粘贴您复制的密钥。

我收到了来自Bitbucket的确认电子邮件,其中已将SSH密钥添加到我的帐户中。

作为参考,在macOS上,使用终端,您可以使用以下命令查看为设备生成的密钥。这是您生成的密钥的存储位置。

ls -la ~/.ssh

正如其他人所说,该文档对我有帮助:将SSH协议与Bitbucket Cloud一起使用


1

按照Atlassian教程中的方法完成ssh,并确保将私钥粘贴在配置文件中,而不是在存储库中:)


您能否提供指向所述链接的链接Atlassian tutorial?将密钥粘贴到配置文件中的步骤是什么,如何知道密钥是否粘贴在存储库中?
EmmanuelB

她就在这里。为您的案例组合选择最佳选择!confluence.atlassian.com/bitbucket/…–
Hector

0

我在一个存储库中遇到了同样的错误-突然,所有其他存储库都出现了,并且在我尝试推送提交时仍然可以正常工作。问题似乎出在SSH密钥上(您已经从前面的评论中知道了)-在bitbucket上,View Profile然后单击Manage Account

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

如果您还没有生成一个,请使用其中一则文章中的说明,但请确保您使用默认的id_dsa.pub文件或自定义名称为“ one”的文件,以后在-i使用时需要带有密钥路径的选项连接即

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

将本地密钥添加到bitbucket上的帐户后,就可以开始与存储库进行交互了。


0

我发现最适合我的解决方案是将推动力分解为更小的部分。

并从提交中删除大屏幕截图图像文件(10mb +)

最终,安全性不再是有关bin文件限制的问题


您会收到OP指出的上述错误,这不是验证/安全性问题吗?那是您提交的大小?
JohnZaj '17年

那就是发生的事情
哈里·波什

0

当存储库不存在时,也会显示此错误。我尝试了所有答案,直到看到回购名称缺少破折号


0

对于错误:

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

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

[错误] 致命:无法为“ https”找到远程帮助器

我按照以下步骤解决了:

首先安装此依赖项:

$ yum install expat expat-devel openssl openssl-devel

然后删除git:

$ yum remove git git-all

现在,在这种情况下,构建并安装最新版本的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/

然后进行配置:

$ 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

如果您已在远程服务器中配置了ssh密钥,则必须将其删除。


0

我收到这个错误

远程主机关闭了与bitbucket.org的连接。致命:无法从远程存储库读取。请确保您具有正确的访问权限。

然后我尝试

git config --global user.email“ you@example.com”

没有报价工作。



0

我正在使用macOS,尽管我下次尝试推送时已在bitbucket中设置了公共密钥

存储库访问被拒绝。

致命:无法从远程存储库读取。

请确保您具有正确的访问权限,并且存储库存在。

我要做的是步骤2。Bitbucket SSH密钥设置指南中所述,尤其是第三步,将密钥添加到ssh-agent中:

(仅适用于macOS)为了使您的计算机在每次重新启动时都能记住您的密码,请打开(或创建)〜/ .ssh / config文件并将以下几行添加到文件中:

主持人*
UseKeychain是

希望它可以帮助Mac用户解决同样的问题。



0

我遇到了这个问题,我以为自己疯了。我已经使用SSH 20年了。和git自2012年以来都通过SSH ...但是为什么我不能在家用计算机上获取我的bitbucket存储库?

好吧,我有两个bitbucket帐户,并且在代理中加载了4个SSH密钥。即使我的.ssh / config配置为使用右键。当ssh初始化连接时,它使用它们的顺序将其加载到代理中。所以我已经登录到我的个人bitbucket帐户。

然后在尝试获取存储库时出现禁止错误。说得通。

我从代理商处卸下了钥匙

ssh-add -d ~/.ssh/personal_rsa

然后我可以获取回购协议。

...后来我发现我可以强迫它仅使用指定的身份

 Host bitbucket.org-user2
     HostName bitbucket.org
     User git
     IdentityFile ~/.ssh/user2
     IdentitiesOnly yes

我不知道最后一个选择 IdentitiesOnly

来自bitbucket文档本身

https://blog.developer.atlassian.com/different-ssh-keys-multiple-bitbucket-accounts/


-1

试一试

git remote add origin <HTTP URL>

1
我们不喜欢每次获取/推送到bitbucket / github / etc /时都输入用户名/密码
Mathieu J.
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.