DistChen

单机配置多个Git账号

在一台电脑上同时使用多个Git账号时(如个人的Github账号和公司的Gitlab账号),有一些配置是需要注意的。否则,账号间会起冲突,使用起来有问题。

当然,如果你以HTTP(S)的方式通信(clone、push代码什么的),不会有任何问题。相信很少人这么做,毕竟每一次输入账号/密码还是很繁琐的。所以这里针对的是使用SSH的方式。

当我们第一次使用Git时,通过下面的命令来生成公钥和私钥:

1
ssh-keygen -t rsa -C "chenyp@chenyp.com" -b 4096

回车后使用默认的路径和文件名称,则会在用户主目录生成下面的两份文件:

1
2
3
~/.ssh
id_rsa
id_rsa.pub

之后将id_rsa.pub里面的内容添加到Github或者Gitlab,然后在电脑上设置下用户信息,如:

1
2
git config --global user.name "DistChen"
git config --global user.email "chenyp@chenyp.com"

这样处理之后,就可以正常在电脑上使用Git了,提交的相应信息也是准确的。如果这时候还想继续在同一台电脑上使用另一个Git账号:如第一次使用的Github,现在要使用Gitlab,那么在配置时需要注意了。

生成公钥和私钥

第二次生成时,不能再继续使用默认路径和文件名了,否则会覆盖第一次生成的文件。因此,使用如下命令生成:

1
ssh-keygen -t rsa -C "ryan@example.cn" -b 4096

回车后,等待提示,然后输入新的的路径和文件名,如:

1
C:\Users\chenyp\.ssh\Gitlab_rsa

之后再一直回车即可,这时会在用户主目录生成如下两份文件:

1
2
3
~/.ssh
Gitlab_rsa
Gitlab_rsa.pub

按照之前的套路,再把Gitlab_rsa.pub里面的内容添加到Gitlab即可。

如果只是这样,从Gitlab上clone代码时,相较于第一次的区别,会提示你输入密码,但其实你根本不知道密码是什么。

为什么会这样,因为私钥文件不对。在没有任何额外配置的情况下,Git客户端会使用默认的私钥文件id_rsa,而不是为Gitlab生成的Gitlab_rsa。因此我们需要添加一些配置来保证Git客户端在和不同的Git Server通信时使用对应的私钥文件。

临时解决方案

将新的私钥加入到 ssh-agent 中即可。ssh-agent是一种控制用来保存公钥身份验证所使用的私钥的程序,其实ssh-agent就是一个密钥管理器,运行ssh-agent以后,使用ssh-add将私钥交给ssh-agent保管,其他程序需要身份验证的时候可以将验证申请交给ssh-agent来完成整个认证过程,执行如下命令添加新的私钥到ssh-agent中:

1
2
eval $(ssh-agent -s)
ssh-add ~/.ssh/Gitlab_rsa

之后就可以正常使用了,不过这种方案是临时的,一旦你关闭掉当前的terminal,下次又要重复输入上面的命令,下面的方案可以避免这种重复输入的麻烦。

永久解决方案

在用户主目录创建名称为config的文件,此文件用于配置Git服务器对应的私钥,按照我上面的示例,我需要添加的内容为:

1
2
3
4
5
6
7
8
Host github.com
RSAAuthentication yes
IdentityFile ~/.ssh/id_rsa
# Company GitLab server
Host git.example.cn
RSAAuthentication yes
IdentityFile ~/.ssh/Gitlab_rsa

HostIdentityFile根据实际情况修改即可,Host 也可以输入IP,不要加上端口(即使部署的不是80或者443端口也不用加)。同理,如果还有第三个或更多,继续生成不同的文件并加入到config文件中即可,之后就可以使用了。

测试

通过如下的命令可以进行测试,格式:ssh -T git@Host,如:

1
2
ssh -T git@github.com
ssh -T git@123.123.123.123

这里写图片描述

由于我们之前设置了全局的用户信息,所以此时往Gitlab提交代码时,会以全局的身份提交(Github上的用户信息),因此将Gitlab上的仓库clone后,进入到该仓库根路径,设置下Gitlab对应的用户信息,保证提交到Gitlab上的用户信息是正确的,否则用户信息会乱掉,如下:

1
2
git config user.name "ryan"
git config user.email "ryan@example.cn"

然后,尽情享受吧!

坚持原创技术分享,您的支持将鼓励我继续创作!