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

Jas*_*ahl 136 git bitbucket git-bash

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

当我尝试使用该命令时

git push origin master
Run Code Online (Sandbox Code Playgroud)

它不起作用.我收到这条消息:

$ 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.
Run Code Online (Sandbox Code Playgroud)

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

Gra*_*ted 226

为那些刚开始使用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"
Run Code Online (Sandbox Code Playgroud)

检查OpenSSH:

$ ssh -v localhost
OpenSSH_4.6p1, OpenSSL...
Run Code Online (Sandbox Code Playgroud)

看到类似的东西?

  • 是的:继续.
  • 否:跳至FOR THE LAZY部分或按照VonC的链接文章进行操作.

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

$ ls -a ~/.ssh/id_*
Run Code Online (Sandbox Code Playgroud)

如果有两个文件,则可以跳过下一步.

$ ssh-keygen
Run Code Online (Sandbox Code Playgroud)

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

$ ls -a ~/.ssh/id_*
Run Code Online (Sandbox Code Playgroud)

检查现有配置文件:

$ ls -a ~/.ssh/config
Run Code Online (Sandbox Code Playgroud)

如果得到结果,请检查此文件是否有错误信息.如果不存在文件,请执行以下操作:

$ echo "Host bitbucket.org" >> ~/.ssh/config
$ echo " IdentityFile ~/.ssh/id_rsa" >> ~/.ssh/config
Run Code Online (Sandbox Code Playgroud)

确认内容:

$ cat ~/.ssh/config

Host bitbucket.org
 IdentityFile ~/.ssh/id_rsa
Run Code Online (Sandbox Code Playgroud)
  • 需要"IdentityFile"之前的单个空格.

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

$ cat ~/.bashrc
Run Code Online (Sandbox Code Playgroud)
  • 如果看到调用的函数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
Run Code Online (Sandbox Code Playgroud)

验证文件是否已成功创建(您的文件应仅在"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
Run Code Online (Sandbox Code Playgroud)
  • 关闭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)
Run Code Online (Sandbox Code Playgroud)

以下应返回结果:

$ ssh-add -l
Run Code Online (Sandbox Code Playgroud)

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

Could not open a connection to your authentication agent.
Run Code Online (Sandbox Code Playgroud)

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

如果,在启动GitBash时,您会看到:

Initializing new SSH agent...
sh.exe": : No such file or directory
Run Code Online (Sandbox Code Playgroud)

这意味着当回显到文件时(即变量被扩展),你忘了用$转义$.重新创建.bashrc以解决此问题.

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

$ ssh-add -l
Run Code Online (Sandbox Code Playgroud)

应该返回类似于此的内容:

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

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

$ cat ~/.ssh/id_rsa.pub
Run Code Online (Sandbox Code Playgroud)

(它应该返回以"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
Run Code Online (Sandbox Code Playgroud)

切换到SSH网址:

$ git remote set-url origin git@bitbucket.org:youraccount/yourproject.git
Run Code Online (Sandbox Code Playgroud)

检查事情是否正常工作:

$ git remote show origin
Run Code Online (Sandbox Code Playgroud)

你应该看到这样的东西:

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)
Run Code Online (Sandbox Code Playgroud)

DONE!

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

对于懒惰

你应该修复VonC描述的SSH问题; 但是,如果你在赶时间承诺和没有工具/时间/知识生成一个新的公钥现在,您的原点设置为HTTPS选择:

> https://accountname@bitbucket.org/accountname/reponame.git
Run Code Online (Sandbox Code Playgroud)

使用诸如TortoiseGit命令行工具之类的GUI 工具.

以下是此替代原始URL的文档.

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

git remote add origin https://accountname@bitbucket.org/accountname/reponame.git
Run Code Online (Sandbox Code Playgroud)

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

git remote set-url origin https://accountname@bitbucket.org/accountname/reponame.git
Run Code Online (Sandbox Code Playgroud)

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

您可能还想设置全局信息:

git config --global user.name "Your Name"
git config --global user.email "you@example.com"
Run Code Online (Sandbox Code Playgroud)

然后再次尝试推送(无需再次提交)

git push origin master
Run Code Online (Sandbox Code Playgroud)

  • 我在StackOverflow上遇到的最佳答案之一 (5认同)

Mat*_*aun 56

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

ssh-add ~/.ssh/id_rsa
Run Code Online (Sandbox Code Playgroud)

  • 这是我的答案,当我创建一个新密钥时,我总是忘记这个问题. (4认同)
  • 同样在这里.我想这个答案可以为很多人节省很多时间. (2认同)

Von*_*onC 25

重新格式化意味着您可能删除了公共和私有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软件集成 "的图片

  • 只是为此添加一点.确保使用BitBucket(如屏幕截图所示)将SSH密钥添加到帐户的SSH密钥(帐户 - >管理帐户 - > SSH密钥).通过存储库设置将其添加为部署密钥只会将该密钥用于只读操作(不提交). (7认同)
  • 2021 年更新:我必须将密钥添加到工作区,而不是“每个存储库”。由于这些键是只读的,而工作区的键允许推送。https://bitbucket.org/<my-workspace>/workspace/settings/ssh-keys 请务必从子存储库中删除相同的密钥,否则您将无法将其添加到工作区 (2认同)

小智 17

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

git remote remove origin
Run Code Online (Sandbox Code Playgroud)

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

git remote add origin httpsUrl
Run Code Online (Sandbox Code Playgroud)

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

git push origin master
Run Code Online (Sandbox Code Playgroud)


Raf*_*ael 6

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

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


小智 5

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

Host bitbucket.org
 IdentityFile ~/.ssh/<privatekeyfile>
Run Code Online (Sandbox Code Playgroud)