繁体   English   中英

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

[英]Cannot push to Git repository on Bitbucket

我创建了一个新的存储库,但遇到了一个奇怪的错误。 我之前在 Bitbucket 上使用过 Git 但我刚刚重新格式化,现在我似乎无法让 Git 工作。 提交后,我不得不将我的 email 和名称添加到全局变量中,但随后它提交得很好。

当我尝试使用命令时

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 的人编写这篇文章(因为在搜索问题中的错误消息时,这既是一个常见问题,又是一个高排名的谷歌结果)。

对于那些不介意 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 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

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

ssh-add ~/.ssh/id_rsa

更新 2021,正如James 评论的那样:

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

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

 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 软件集成

我通过使用命令删除遥控器解决了这个问题:

git remote remove origin

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

git remote add origin httpsUrl

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

git push origin master

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

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

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

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

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

1 - HTTPS 和 SSH 的连接 URL 不同

通过 https 连接时,您使用

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

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

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

尝试使用前面的帐户名连接到 SSH 会导致原始发布者收到的错误。 这是您如何进行连接到 git@ 的测试,然后错误地尝试使用您的用户名并看到错误。

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

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

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

所以我遵循了本指南,我的问题消失了: https : //blog.developer.atlassian.com/different-ssh-keys-multiple-bitbucket-accounts/

如果您使用的是 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 一起使用

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

存储库访问被拒绝。

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

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

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

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

主持人 *
使用钥匙串 是

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

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

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. 如果您已初始化您的存储库并想从头开始,请使用$rm -rf .git取消跟踪 git,它会递归地删除 git
  3. 检查您没有使用“Apple Git”。 输入它应该说的which git /usr/local/bin/git - 如果您使用 Homebrew $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"生成新的 SSH 密钥 保存密钥
  • 系统将提示您输入用于保存密钥的文件和密码。 两个步骤都按 Enter 键,将两个选项留空(默认名称,无密码)。
  • 将您的新密钥添加到 ssh-agent: ssh-add ~/.ssh/id_rsa
  • 通过登录 Github,访问帐户设置并单击SSH 密钥,将您的 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。 链接 repos 时,使用 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 月)。

  • 在命令行上创建一个新的存储库 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

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

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

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

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

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

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

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

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

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

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

对于错误:

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

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

[错误]致命:无法找到“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 密钥,则必须将其删除。

我收到这个错误

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

然后我试过了

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

没有引号。

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

请参阅我对Serverfault 的回答

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

我有这个问题,我以为我疯了。 我已经使用 SSH 20 年了。 和 git over SSH 自 2012 年以来......但为什么我不能在我的家用电脑上获取我的 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/

Just navigate to your source project, open.git folder, open the config file with notepad++ (or any other text editor) and compare the two git's URL on this file with the URL on your source git. 它解决了我的问题。

试一试

git remote add origin <HTTP URL>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM