通过SSH免密提交代码到github,屡用不爽啊,本人很喜欢。
本人两个github账号count A和count B,分别记录不同的东西,先前一台电脑上只使用一个账号 count A,并没有发现什么问题。
但是最近准备也同时在本电脑上使用另一个count B账号,在添加公钥到github时,提示"Key is already in use",原因是这个电脑上的公钥已经配置到count A了, 而github是不允许一个公钥同时添加到多个账户的,不然github服务器检测到有多个公钥和你的私钥匹配,你的每次提交岂不是要被提交到多个账号或错误账号对应的仓库中了(Oh My God,老板很生气,后果很严重)
查了网上基本上都是如下两种相关方案
1,删除count A中配置的公钥,这样就可以将公钥留出来配置到count B中(这个遇到与我一样的问题,但是删除了count A中的公钥,我以后还如何往count A中提交代码,总不能删来删去,加来加去吧)
2,另一种是git多账号配置,但是点进去一看,大多是为不同的仓库托管平台github、gitlab、gitee进行配置, 提交代码到这些不同平台的仓库(此种与其说是多账号,倒不如说是多平台配置嘛,且同时在这不同的平台上使用同一把公钥也是允许的,更不会报"Key is already in use", 些方案也解决不了我的问题)
那么有没有一种方案够满足在同一台电脑上同时使用不同类型的git代码托管平台、同一平台下不同的账号呢?
答案:没有..........不可能,自然是有的了,以下进入最正点的解决方案部分:
首先为了便于密钥的个性化管理,在本机用户的.ssh下为不同平台和不同用户创建不同的密钥文件夹:
1,github-552277(该文件夹用来保存github上的用户名为552277账号密钥
2,github-dailyplanner(该文件夹用来保存github上用户名为dailyplanner账号密钥)
3,gitee-dailyplanner(该文件夹用来保存gitee上用户名为dailyplanner账号密钥)
并分别在各个文件夹下按如下方式生成一对密钥:
并分别在各个文件夹下按如下方式生成一对密钥:
$ ssh-keygen -t rsa -C "[email protected]"
Generating public/private rsa key pair.
Enter file in which to save the key (/c/Users/weichangzhong/.ssh/id_rsa): /c/Users/weichangzhong/.ssh/github-552277/id_rsa
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /c/Users/weichangzhong/.ssh/github-552277/id_rsa.
Your public key has been saved in /c/Users/weichangzhong/.ssh/github-552277/id_rsa.pub.
The key fingerprint is:
SHA256:PJuK5kRDsZRgOJGKdp5NJtUPvdwGnJUIxNefD0/Bj9I [email protected]
The key's randomart image is:
+---[RSA 3072]----+
|.+o.o.+o+ =.. . |
|+. ..+ + B o o |
|o. + = + ....o|
|o. + o . + o.+E..|
|. o O S . .= |
| + o + o |
| . o |
| ... . |
| oo . |
+----[SHA256]-----+
然后在.ssh下创建ssh的无后缀名的配置文件config,使git命令执行时能够根据该文件的配置信息获取不同的密钥,
config:
Host github-552277.com
HostName github.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/github-552277/id_rsa
User git
Host github-dailyplanner.com
HostName github.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/github-dailyplanner/id_rsa
User git
Host gitee-dailyplanner.com
HostName gitee.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/gitee-dailyplanner/id_rsa
User git
其中
1)Host后面的主机别名随意取,但是后续初始化本地跟踪远程项目的仓库时会用到
2)HostName后面的主机名,要和所要配置密钥的git托管平台的域名主体部分一致
3)IdentityFile 后面是相应平台密钥文件所在路径+密钥文件名称
注意: 同一个主机别名只能配置一个密钥,如果多个HOST 主机别名相同,则只有第一个生效。
最后使用各个密钥的流程如下:
1,向gitee 552277账号中新建的仓库github-527-rep提交代码:
正常的流程应该是如下
echo "# github-527-rep" >> README.md
git init
git add README.md
git commit -m "first commit"
git remote add origin [email protected]:552277/github-527-rep.git
git push -u origin master
而我们变更了github的主机别名后,则需要将其中命令:
git remote add origin [email protected]:552277/github-527-rep.git
变更为如下即可
git remote add origin [email protected]:552277/github-527-rep.git
其中gitee-552277.com就是我们在.ssh/config中配置的别名,当我们执行如下命令时, git会自动识别为通过SSH协议连接远程仓库,并在用户的.ssh/config中找到名称为github-552277的配置信息:
Host github-552277.com
HostName github.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/github-552277/id_rsa
User git
然后根据配置信息知道要从~/.ssh/github-552277/id_rsa文件中获取密钥,链接到github.com托管平台的服务,找到552277用户的github-527-rep仓库进行关联,并在本地当前项目隐藏目录.git/config下生成关联的远程仓库信息。
[core]
repositoryformatversion = 0
filemode = false
bare = false
logallrefupdates = true
symlinks = false
ignorecase = true
[remote "origin"]
url = [email protected]:552277/github-527-rep.git
fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
remote = origin
merge = refs/heads/master
第一次执行带分支另名的命令后,以后每次执行与远程仓库相关的命令时,不必再在命令行中添加git远程仓库信息,每次都从配置文件中获取相应的 远程仓库信息和密钥,然后再进行连接并执行相关操作
注意,如果是克隆原来已有的分支到本地,也要将对应的克隆命令:
git clone [email protected]:552277/github-527-rep.git
改为:
git clone [email protected]:552277/github-527-rep.git
即凡是直接用到[email protected]:username/rep.git的,都要做相应的改动。
2,同理,如果第一次执行与github dailyplanner账号下的github-dailyplanner-rep仓库相关操作时,则只需要将其中
[email protected]:dailyplanner/github-dailyplanner-rep.git
命令改为如下即可:
[email protected]:dailyplanner/github-dailyplanner-rep.git
3,同理,如果第一次执行与gitee平台的dailyplanner账号下的gitee-daily-rep仓库相关操作时,则只需要将命令
[email protected]:dailyplanner/gitee-daily-rep.git
变更为如下即可
[email protected]:dailyplanner/gitee-daily-rep.git
4,如果执行[email protected]:dailyplanner/gitlab-dailyplanner-rep.git相关命令时............
......what ......竟然在.ssh/config中找不到相关配置了......
不过这时它才会使用默认的配置,就是使用.ssh/id_rsa密钥,连接到gitlab托管服务,找到dailyplanner用户的github-dailyplanner-rep仓库进行关联,并在本地当前项目隐藏目录.git/config下生成关联的远程仓库信息。
如上方案,即可实现在同一台电脑上使用同一个或不同的密钥连接不同的代码托管平台 或 使用不同的密钥连接同一类代码托管平台中的不同账号