164

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

21 回答 21

246

为那些刚开始在 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 THE 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
于 2014-09-30T21:15:54.207 回答
63

如果您忘记将私钥添加到ssh-agent. 这样做:

ssh-add ~/.ssh/id_rsa
于 2015-01-19T21:46:23.890 回答
31

正如詹姆斯所评论的,2021 年更新:

我必须将我的密钥添加到工作区,而不是基于“每个存储库”。

由于这些键是只读的,并且工作区的键允许推送。

bitbucket.org/<my-workspace>/workspace/settings/ssh-keys 

只需确保从子存储库中删除相同的密钥,否则您将无法将其添加到工作区。


原始答案(2013):

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

您需要重新生成它们并在您的 BitBucket 配置文件上发布您的公共 ssh 密钥,如“使用 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 软件集成

于 2013-04-18T05:58:59.750 回答
25

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

git remote remove origin

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

git remote add origin httpsUrl

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

git push origin master
于 2016-11-18T05:01:34.983 回答
5

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

Host bitbucket.org
 IdentityFile ~/.ssh/<privatekeyfile>
于 2017-04-11T08:07:44.440 回答
4

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

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

于 2014-08-10T12:53:46.870 回答
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 的有用提示

于 2016-08-01T14:05:11.263 回答
2

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

所以我按照本指南进行操作,我的问题就消失了:https ://blog.developer.atlassian.com/different-ssh-keys-multiple-bitbucket-accounts/

于 2020-08-19T12:39:11.767 回答
1

Git 更改了它的一些 repo 说明 - 检查您是否已将本地 repo 连接到 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. 如果你已经初始化了你的 repo 并且想从头开始,取消跟踪 git 以$rm -rf .git递归方式删除 git
  3. 检查您没有使用“Apple Git”。键入which git它应该说/usr/local/bin/git- 如果您使用 Homebrew 安装 git$brew install 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"通过键入SAVE THE KEY生成新的 SSH 密钥
  • 系统将提示您输入文件以保存密钥和密码。两个步骤都按回车键,两个选项都留空(默认名称,没有密码)。
  • 将新密钥添加到 ssh-agent: ssh-add ~/.ssh/id_rsa
  • 通过登录 Github,访问Account settings并单击SSH keys ,将您的 SSH 密钥添加到 GitHub 。单击添加 SSH 密钥

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

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

  • Title字段中输入可以识别您机器的内容,例如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.
    

现在您的本地计算机已连接到云,您可以在线或在本地计算机上创建一个 repo。Git 已将分支 main 的名称更改为 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.

按照您现在在您的 repo 上获得的步骤进行操作 - GitHub 添加了一个额外的步骤来创建一个分支(编写时间为 2020 年 10 月)。

  • 在命令行上创建一个新存储库 echo "# testing-with-jest" >> README.md git init git add README.md git commit -m "first commit" git branch -M main git remote add origin — (使用HTTPS url 不是 SSH) git push -u origin main

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

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

于 2020-10-06T10:35:44.690 回答
1

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

于 2018-11-01T21:06:21.797 回答
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

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

于 2017-03-04T14:54:00.360 回答
1

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

存储库访问被拒绝。

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

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

我要做的是第 2 步。按照Bitbucket SSH 密钥设置指南中的说明,尤其是第 3 步,将密钥添加到 ssh-agent :

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

主机 *
UseKeychain 是

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

于 2018-06-05T22:47:01.507 回答
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 密钥,则必须将其删除。

于 2017-05-17T14:05:29.517 回答
0

我发现 git 命令行并不喜欢我的选美生成密钥(Windows 10)。

查看我在Serverfault上的回答

于 2017-12-11T14:58:41.887 回答
0

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

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

然后在尝试获取 repo 时出现 Forbidden 错误。说得通。

我从代理中卸载了密钥

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/

于 2020-03-18T00:51:40.420 回答
0

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

于 2017-05-11T09:29:13.120 回答
0

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

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

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

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

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

于 2015-08-10T18:37:57.077 回答
0

这可能是由于 SSH 代理(和/或 BitBucket)中有多个 SSH 密钥造成的。查看Atlassian 文档以了解解决方法

于 2019-06-13T16:18:08.870 回答
0

我发现最适合我的解决方案是将推送分成更小的块。

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

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

于 2017-01-30T08:05:38.627 回答
0

我收到了这个错误

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

然后我尝试了

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

没有引号工作。

于 2017-12-09T19:20:27.487 回答
-1

试试看嘛

git remote add origin <HTTP URL>
于 2019-08-19T08:53:02.033 回答