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

时间:2013-04-18 05:00:38

标签: git bitbucket git-bash

我创建了一个新的存储库,但我遇到了一个奇怪的错误。我之前在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.

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

21 个答案:

答案 0 :(得分:219)

为那些刚开始使用Windows上的Git和BitBucket的人写这篇文章。谁不熟悉Bash(因为在搜索问题中的错误消息时,这既是一个常见问题,也是一个高排名的Google结果)。

对于那些不介意使用HTTPS并且正在寻找快速修复的人,请滚动到此答案的底部,以获取对于懒惰

下的说明

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

尽快修复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

(它应该返回以&#34开头的内容; 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
  • 进入包含项目的目录
  • 将您的原点更改为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

使用TortoiseGitcommand line tools等GUI工具。

Here is the documentation of this alternative origin 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

答案 1 :(得分:55)

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

ssh-add ~/.ssh/id_rsa

答案 2 :(得分:24)

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

您需要重新生成它们并在BitBucket配置文件上发布公共ssh密钥,如“Use the SSH protocol with Bitbucket”中所述,在“Set up SSH for Git with GitBash”之后。

帐户 - >管理帐户 - > 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

来自“Integrating Mercurial/BitBucket with JetBrains software

的图片

答案 3 :(得分:17)

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

git remote remove origin

然后尝试使用https url而不是ssh

添加远程
git remote add origin httpsUrl

它要求github凭据。输入凭据然后尝试使用:

推送到git
git push origin master

答案 4 :(得分:4)

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

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

答案 5 :(得分:3)

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

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

答案 6 :(得分:2)

两个小小的澄清可能会让我感到困惑:

1 - HTTPS和SSH的连接URL不同

通过https连接时,请使用

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

然而,当通过SSH连接时,帐户名称始终&#34; git&#34;

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

尝试使用您的帐户名称连接到SSH将导致原始海报收到错误。这是你如何进行连接到git @的测试,然后错误地尝试使用你的用户名并看到错误。

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

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

答案 7 :(得分:2)

可能不是每个人都这样,但是如果有人有相同的原因,我仍然在这里回答。基本上我有两个Bitbucket帐户,每个帐户都有两个不同的公钥。通过运行ssh -Tv bitbucket.org,我设法看到笔记本电脑发送的密钥不正确(但是由于两个公钥都在bitbucket中注册,因此该密钥仍被批准,然后由于该密钥已链接到另一个无法访问的帐户我正在推送的仓库,推送被拒绝)。

所以我遵循了本指南,但问题不再存在:https://blog.developer.atlassian.com/different-ssh-keys-multiple-bitbucket-accounts/

答案 8 :(得分:1)

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

  1. 在SourceTree中,转到偏好设置。
  2. 转到“帐户”标签,然后选择您的帐户。
  3. 应该有一个生成SSH密钥并将其复制到剪贴板的选项。
  4. 复制后,请在浏览器中访问Bitbucket。转到[头像] - &gt; Bitbucket设置。
  5. 转到SSH密钥。
  6. 点击添加密钥
  7. 粘贴您复制的密钥。
  8. 我收到Bitbucket发来的确认电子邮件,说我的帐户已添加了SSH密钥。

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

    ls -la ~/.ssh
    

    正如其他人所说,这份文件帮助了我:Use the SSH protocol with Bitbucket Cloud

答案 9 :(得分:0)

Git更改了一些回购说明-检查您是否已将本地回购连接到Git云-检查每个步骤以查看是否错过了任何回购。

Git文档[https://docs.github.com/en/free-pro-team@latest/github/authenticating-to-github/connecting-to-github-with-ssh],如果您喜欢以下文档-它要详细得多,值得一读,以了解为什么总结了以下步骤。

我的Git清单:-

  1. master分支已更改为main
  2. 如果您已初始化存储库并希望从头开始,请使用$rm -rf .git取消跟踪git,以递归方式删除git
  3. 检查您是否未使用“ Apple Git”。键入which git,它应该显示/usr/local/bin/git-如果要使用Homebrew $brew install git安装git
  4. 为提交配置您的姓名和电子邮件地址(确保使用您在Github中注册的电子邮件地址):
$git config --global user.name "Your Name"
$git config --global user.email "you@example.com"
  • 配置git以跟踪文件名的大小写更改:
$git config --global core.ignorecase false

如果输入有误,可以更新文件$ls -a来查找文件,然后$open .gitignore进行编辑,保存并关闭。

  1. 使用SSH密钥将您的本地链接到存储库。 SSH密钥是一种无需信任密码即可识别受信任计算机的方法。
    生成新密钥的步骤
  • 通过键入ssh-keygen -t rsa -C "your_email@example.com"保存密钥来生成新的SSH密钥
  • 系统会提示您输入文件以保存密钥和密码。按下Enter键,将两个步骤都保留为空白(默认名称,无密码)。
  • 将新密钥添加到ssh-agent中: ssh-add ~/.ssh/id_rsa
  • 登录到Github,访问帐户设置,然后单击 SSH密钥,将SSH密钥添加到GitHub。点击添加SSH密钥

您也可以通过单击个人资料图片及其左侧导航栏中的编辑键来找到它。

  • 使用终端命令将密钥复制到剪贴板: pbcopy < ~/.ssh/id_rsa.pub

  • 标题字段中输入可以识别您的计算机的名称,例如 YOUR_NAME的MacBook Air

  • Key 字段中,只需按 cmd + V 粘贴先前创建的密钥-请勿在键中添加或删除字符或空格

  • 单击添加键,然后通过键入以下命令检查终端中的所有功能是否正常: ssh -T git@github.com

    您应该看到以下消息:

    Hi YOUR_NAME! You've successfully authenticated, but GitHub does not provide shell access.
    

现在,您的本地计算机已连接到云,您可以在线或在本地计算机上创建存储库。 Git更改了分支主管的名称master。 链接存储库时,使用HTTPS密钥而不是SSH密钥更加容易。虽然您最初需要SSH来链接存储库,以避免问题中的错误。

Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

按照现在在存储库中执行的步骤-GitHub添加了一个额外的步骤来创建分支(撰写本文时为2020年10月)。

  • 在命令行上创建新的存储库 回声“#测试,开玩笑” >> README.md git初始化 git添加README.md git commit -m“第一次提交” git branch -M主 git remote add origin — (使用HTTPS网址而不是SSH) git push -u origin main

  • 从命令行推送现有存储库 git remote add origin (使用HTTPS网址而非SSH) git branch -M主 git push -u origin main

如果弄错了,您总是可以通过从本地计算机$rm -rf .git的git文件夹中删除初始化来重新开始,然后重新开始-但是首先检查是否没有遗漏上述步骤是很有用的事实的最佳来源始终是文档-即使阅读和理解需要更长的时间!

答案 10 :(得分: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/

答案 11 :(得分:0)

只需尝试

git remote add origin <HTTP URL>

答案 12 :(得分:0)

这可能是由于SSH代理(和/或BitBucket)中有多个SSH密钥引起的。选中Atlassian documentation for the workaround for this

答案 13 :(得分:0)

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

答案 14 :(得分:0)

我正在使用macOS,虽然我下次尝试推送时已经在bitbucket中设置了我的公钥

  

存储库访问被拒绝。

     

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

     

请确保您拥有正确的访问权限   存储库存在。

我必须做的是步骤2.将密钥添加到ssh-agent ,如Bitbucket SSH keys setup guide中所述,特别是第3步:

  

(仅限macOS)这样您的计算机每次都会记住您的密码   它重新启动,打开(或创建)〜/ .ssh / config文件并添加它们   到文件的行:

     

主持人*
  UseKeychain yes

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

答案 15 :(得分:0)

我发现git命令行并不适合我的选美生成键(Windows 10)。

请参阅Serverfault

上的答案

答案 16 :(得分:0)

我收到了这个错误

  

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

然后我试了

  

git config --global user.email&#34; you@example.com"

没有引号。

答案 17 :(得分: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密钥,则必须将其删除。

答案 18 :(得分:0)

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

答案 19 :(得分:0)

我发现对我来说效果最好的解决方案就是将其推向更小的块。

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

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

答案 20 :(得分:0)

我在一个存储库中遇到了同样的错误 - 突然之间,当我尝试推送提交时,所有其他存储器仍然正常工作。问题似乎与SSH密钥有关(正如您之前的评论中所知) - 在bitbucket上转到View Profile然后点击Manage Account

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

如果还没有生成一个 - 请使用其中一个帖子中的说明,但请确保使用默认的id_dsa.pub文件或自定义命名的文件,稍后需要-i选项在连接时使用键的路径即

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

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