当有多个git账号时,比如:
一个github,国际认可的仓库
一个gitee码云,国内仓库,速度快
这两者如果邮箱不同的话,在生成第二个key的时候会覆盖第一个的key,导致一个用不了。
解决办法就是:
生成两个(或多个)不同的公私密钥对,用config文件管理它们。
1 步骤
我们假设原来在~/.ssh目录下已经生成了一个密钥对:
id_rsa
id_rsa.pub
1.1 生成第二个key
接下来我们生成第二个ssh key:
ssh-keygen -t rsa -C "yourmail@gmail.com"
这里不要一路回车,我们自己手动填写保存路径:
Generating public/private rsa key pair.
Enter file in which to save the key (/c/Users/Gary/.ssh/id_rsa): /c/Users/Gary/.ssh/id_rsa_github
<剩下两个直接回车>
这里我们用id_rsa_github来区别原有密钥对,避免被覆盖。
完成之后,我们可以看到~/.ssh目录下多了两个文件,变成:
id_rsa
id_ras.pub
id_rsa_github
id_rsa_github.pub
known_hosts
1.2 打开ssh-agent
这里如果你用的github官方的bash,用:
ssh-agent -s
如果是其他的,比如msysgit,(windows下需要使用git-bash,不能用powershell等)用:
eval $(ssh-agent -s)
略过这一步的话,下一步会提示这样的错误:Could not open a connection to your authentication agent.
Ps:
所谓“打开ssh-agent”,即开启ssh-agent服务。
Windows下可以这样开启:
Windows下使用ssh-add报错 Error connecting to agent: No such file or directory
也可以这样开启:
SSH key的介绍与在Git中的使用
如果提示 “Could not open a connection to your authentication agent.” 说明你的ssh agent并没有运行;使用下面的命令运行ssh agent,再使用ssh-add命令添加你的ssh key。
# macOS/Linux
$ eval `ssh-agent`
# 在Windows中的git-bash中
$ eval $(ssh-agent)
1.3 添加私钥
ssh-add ~/.ssh/id_rsa
ssh-add ~/.ssh/id_rsa_github
如果提示文件或目录不存在,就使用绝对地址。
Ps:
Windows下使用ssh-add报错 Error connecting to agent: No such file or directory
windows下使用密钥进行ssh连接出现私钥文件未保护警告-Permissions for ‘C:\Users\zhangjiequan\.ssh\id_rsa’ are too open
Bad owner or permissions on .ssh/config win10问题解决
1.4 创建config文件
在~/.ssh目录下创建名为config的文件。
添加以下内容:
# gitee and github
# 注意:多个Host公用一个公钥时,
# 对应的HostName和Port必须跟在Host后面
Host gitee.com
HostName gitee.com
Host github.com
HostName github.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa
# gerrit
Host gerrit.awaimai.com
HostName gerrit.awaimai.com
Port 8000
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa_gerrit
# home_gitlab
Host 119.34.4.123
HostName 119.34.4.123
Port 9200
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa_home_gitlab
#注意,这里多个Host公用一个公钥,如果像原文作者说的那样,两组Host&HostName&Port依次写,会不能正确识别第一组,ssh -T git@第一组Host,会报Permission denied (publickey),不懂。先分开写,分开写是可以的。
Host 192.168.2.164
HostName 192.168.2.164
Port 30001
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa_home_gitlab
# 其他的统一用id_rsa文件登陆,或者密码。
# 注意:这里的第二行后面有个password,就是同时允许密码登陆
# 不然第一次没加公钥,密码也登陆不了,会提示错误:Permission denied (publickey,password).
Host *
PreferredAuthentications publickey,password
IdentityFile ~/.ssh/id_rsa
其中,Host和HostName填写git服务器的域名。
IdentityFile指定私钥的路径。
如果在Linux系统下提示错误:Bad owner or permissions on /home/gary/.ssh/config
说明config权限过大,chmod命令调整:
$ chmod 644 ~/.ssh/config
然后在github和gitee码云上添加公钥即可,这里不再多说。
上面的home_gitlab是一个ip+端口的形式的示例.
1.5 测试
然后用ssh命令分别测试:
ssh -T git@github.com
ssh -T git@gitlab.bbbb
ssh -T git@192.168.2.164
2 调试
如果到这里你没有成功的话,别急,教你解决问题的终极办法–debug
比如测试github:
ssh -vT git@github.com
-v 是输出编译信息,然后根据编译信息自己去解决问题吧。
就我自己来说一般是config里的host那块写错了。
3 关于用户名
如果之前有设置全局用户名和邮箱的话,需要unset一下
git config --global --unset user.name
git config --global --unset user.email
然后在不同的仓库下设置局部的用户名和邮箱
比如在公司的repository下
git config user.name "yourname"
git config user.email "youremail"
在自己的github的仓库在执行刚刚的命令一遍即可。
这样就可以在不同的仓库,已不同的账号登录。
用户名这个有点坑哦
Ps:
端口+ip 如何clone?
ssh://git@localhost:30001/family/bookvaccine.git
然后具体的ip和端口为上面的home_gitlab,那么可以这样子clone
git clone ssh://git@192.168.2.164:30001/family/learn-git.git
git clone ssh://git@119.34.4.123:9200/family/bookvaccine.git
参考地址:
http://www.jianshu.com/p/f7f4142a1556
https://www.jianshu.com/p/b1eeb3f1a2c1
Ref:git配置多个SSH Key