无法推送到Bitbucket上的Git存储库
我创build了一个新的存储库,并且遇到了一个奇怪的错误。 我以前在Bitbucket上使用Git,但是我只是重新格式化,现在我似乎无法让Git工作。 做完提交后,我不得不把我的电子邮件和名字添加到全局variables中,但是这样做确实很好。
当我尝试使用该命令
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(因为在search问题中的错误消息时这是一个常见问题和高排名的Google结果)。
对于那些不介意使用HTTPS的用户以及正在寻求快速修复的用户,请滚动至此答案的底部,以获取“ FOR THE LAZY”
对于那些希望解决实际问题的人,请按照以下说明操作:
尽可能快地修复SSH问题
这是由VonC链接到的URL的一组指令。 它被修改为尽可能有弹性和简洁。
-
不要input
$
或任何不以$
开头的行($
表示这是你input到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
将所有内容保留为默认值,input密码。 你现在应该看到这个命令的结果:
$ ls -a ~/.ssh/id_*
检查现有的configuration文件:
$ 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中input以下内容来创build.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
validation文件是否已成功创build(您的应该只在出现“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
- closuresGitBash并重新打开它。
- 您应该被要求input您的密码(对于之前生成的SSH文件)。
- 如果没有提示,你要么没有设置密码或GitBash没有运行.bashrc脚本(这将是奇怪的,所以考虑审查它的内容!)。 如果你在Mac(OS X)上运行这个,默认情况下
.bashrc
不会被执行 –.bash_profile
是。 为了解决这个问题,把这个片段放在你的.bash_profile
:[[ -s ~/.bashrc ]] && source ~/.bashrc
如果你没有input密码,你可能会在启动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
这意味着你忘了在回显文件时(即扩展variables)使用\来避开$。 重新创build你的.bashrc来解决这个问题。
validation代理正在运行,并且您的密钥已被添加:
$ 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+A
CTRL+C
将公钥再次复制到剪贴板。
通过执行以下步骤,使用BitBucketconfiguration您的私钥:
- 打开浏览器并导航到BitBucket.org网站
- login到BitBucket.org
- 点击你的头像(右上angular)
- 点击pipe理帐户
- 单击SSH密钥(在左侧菜单的安全下)
- 点击添encryption钥
- input标签的
Global Public Key
- 粘贴您从记事本复制的公钥
Global Public Key
input现在应该在您的密钥列表中可见。
- 返回到GitBash
- 进入包含你的项目的目录
- 将您的起源更改为SSH版本(如果您运行FOR THE LAZY步骤,则不会这样)
检查你的遥控器:
$ git remote -v
切换到SSHurl:
$ 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)
DONE!
您可以select使用HTTPS而不是SSH。 它将要求您在远程操作期间input密码(键入一次后会暂时caching)。 这里是你如何configurationHTTPS:
对于懒惰
您应该修复VonC所描述的SSH问题; 但是,如果您现在急于提交并且没有工具/时间/知识来生成新的公钥,请将您的起源设置为HTTPS备选scheme:
> https://accountname@bitbucket.org/accountname/reponame.git
使用TortoiseGit等GUI工具或命令行工具 。
以下是这个替代原始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
重新格式化意味着你可能已经删除了你的公钥和私钥(在〜/ .ssh中)。
您需要重新生成它们,并在您的BitBucketconfiguration文件上发布您的公共ssh密钥,如“ 使用 GitBash为Git设置SSH ”一文中所述, 使用“与Bitbucket协同使用SSH协议 ”。
帐户 – >pipe理帐户 – > SSH密钥:
然后:
“ 集成Mercurial / BitBucket与JetBrains软件 ”
我通过删除远程使用命令解决了这个问题:
git remote remove origin
然后尝试使用https url而不是ssh添加远程
git remote add origin httpsUrl
它要求github凭据。 input凭据,然后尝试使用以下命令推送到git:
git push origin master
我有同样的问题。 我的SSH密钥设置正确。 我解决了这个问题。
在Bitbucket中创build新项目后,使用clone。 在terminalinput克隆命令,它应该克隆空的项目到您的计算机。 之后,你可以复制你的文件到这个目录,并开始提交并推送到bitbucket。
两个小澄清,可能会救一个人我所经历的困惑:
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 @的testing,然后错误地尝试使用你的用户名,并看到一个错误。
2 – 通过团队帐户的SSH密钥将在2017年弃用
如果您在团队帐户上设置SSH密钥,则build议将其切换到个人帐户。 一个有用的提示,以避免e
只需要〜/ .ssh目录下的configuration文件
ref: https : //confluence.atlassian.com/bitbucket/set-up-ssh-for-git-728138079.html
在configuration文件中添加波纹pipeconfiguration
Host bitbucket.org IdentityFile ~/.ssh/<privatekeyfile>
对于一个仓库,我得到了这个相同的错误 – 突然间,所有其他仓库在我尝试推送提交时仍然正常工作。 问题似乎与SSH密钥(你已经知道从以前的评论) – 在bitbucket去View Profile
然后单击Manage Account
。
在左侧点击SSH Keys
然后在〜/ .ssh /目录下添加你的系统。
如果您还没有生成一个 – 使用其中一个post的说明,但要确保您使用默认的id_dsa.pub文件或自定义的命名文件,稍后需要-i
选项和密钥的path当你连接即
ssh -i ~/.ssh/customkeyname username@ip_address
一旦你在bitbucket中添加了本地密钥到你的账户,你就可以开始与你的仓库交互了。
我发现最适合我的解决scheme是分解成小块。
并从提交中删除大的截图图像文件(10MB +)
最后,关于bin文件的限制,安全性并不是问题
如果您正在使用SourceTree(我正在使用2.4.1),我发现了一个更简单的方法来生成一个SSH密钥,并将其添加到我的Bitbucket设置。 这解决了我的问题。
- 在SourceTree中,转到“首选项”。
- 转到帐户标签并select您的帐户。
- 应该有一个选项来生成SSH密钥并将其复制到剪贴板。
- 一旦你复制了,在你的浏览器中转到Bitbucket。 转到[avatar] – > Bitbucket设置。
- 转到SSH密钥。
- 点击添encryption钥
- 粘贴您复制的密钥。
我收到一封来自Bitbucket的确认邮件,说明SSH密钥已经添加到我的帐户中。
作为参考,在macOS上,使用Terminal,可以使用以下命令查看为您的设备生成的密钥。 这是您生成密钥的地方。
ls -la ~/.ssh
正如其他人所说,这个文档帮助我: 与Bitbucket云使用SSH协议
当存储库不存在时,这个错误也会显示出来。 我试了所有的答案,直到我看到回购的名字是缺less一个破折号
对于错误:
[错误] 存取库访问被拒绝。 通过部署密钥访问是只读的。 致命的:无法从远程存储库读取。 请确保您拥有正确的访问权限并存在存储库。
[错误] 致命:无法从远程存储库读取。
[错误] 致命的:无法find'https'的远程助手
我解决了以下步骤:
首先安装这个依赖关系:
$ yum install expat expat-devel openssl openssl-devel
然后删除git:
$ yum remove git git-all
现在在最后的版本上构build并安装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/
然后进行configuration:
$ 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
如果您在远程服务器上configuration了ssh密钥,则必须将其删除。