为那些刚开始在 Windows 上使用 Git 和 BitBucket 以及不熟悉 Bash 的人编写这篇文章(因为在搜索问题中的错误消息时,这既是一个常见问题,也是一个高排名的 Google 结果)。
对于那些不介意 HTTPS 并且正在寻找快速修复的人,请滚动到此答案的底部以获取FOR THE LAZY下的说明
对于那些希望解决实际问题的人,请按照以下说明进行操作:
尽快修复 SSH 问题
这是一组源自 VonC 链接的 URL 的指令。它被修改为尽可能有弹性和简洁。
如果您还没有设置您的全局信息:
$ 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 配置您的私钥:
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