引言

一般来说,安装好 git 后,我们都会配置一个全局的 config 信息,就像这样:

  1. git config --global user.name "anin"
  2. git config --global user.email "1119772098@qq.com"

但是你可能会碰到需要在一台电脑上配置多个用户信息的需求。此时就不能够用一个全局配置搞定一切了。

比如因为我的个人电脑出了问题,我想要提交我的个人项目时,只能用公司配的电脑去提交。而公司的电脑配置的是私有的 gitlab 仓库,而我自己的项目存储在 gitee 上。这两个仓库不仅仓库地址不一样,仓库的用户名和邮箱都不一样。

配置多用户

本文将配置分别是 gitee 以及 aliyun云效 上的两个用户,并分别在它们所属的项目上进行 git 操作,这差不多就是配置多用户的大部分操作了。


gitee 云效
用户名 anin cln
邮箱 1119772098@qq.com cln@dingtalk.com

设置全局配置

和引言一样配置,但是这里要注意的是,如果设置了全局配置,那么后面git提交默认的就是这个配置,除非有制定local级别的配置。
所以尽量把常用的账户设置为全局,然后对于不常用的,在仓库里设置local级别的配置,这就是本文的思路。
这是因为 git 的配置分为三级别,System —> Global —>Local。System 即系统级别,Global 为配置的全局,Local 为仓库级别,优先级是 Local > Global > System。

  1. git config --global user.name "anin"
  2. git config --global user.email "1119772098@qq.com"

生成钥对

钥对的保存位置默认在 ~/.ssh 目录下,我们先清理下这个目录中已存在的钥对信息,即删除其中的 id_rsaid_rsa.pub 之类的公钥和密钥文件。
首先我们开始生成 gitee 上的仓库钥对,通过 -C 参数填写 gitee 的邮箱:

  1. ssh-keygen -t rsa -C 1119772098@qq.com

按下 ENTER 键后,会有如下提示:

  1. Generatingpublic/privatersa key pair.Enter fileinwhich to save the key (/Users/anin/.ssh/id_rsa):

在这里输入公钥的名字,默认情况是叫 id_rsa,为了和后面的 gitlab 配置区分,这里输入 anin_id_rsa。输入完毕后,一路回车,钥对就生成完毕了。
下面开始生成 yunxiao 上的仓库钥对,步骤和上面一样:

  1. ssh-keygen -t rsa -C cln@dingtalk.com

生成的公钥名就叫做:anin_id_rsa。

添加 SSH Keys

image.png
image.png

添加私钥

在上一步中,我们已经将公钥添加到了 gitee 或者 云效 服务器上,我们还需要将私钥添加到本地中,不然无法使用。添加命令也十分简单,如下:

  1. ssh-add ~/.ssh/anin_id_rsa // 将 gitee 私钥添加到本地
  2. ssh-add ~/.ssh/dingtalk_id_rsa // 将 yunxiao 私钥添加到本地

添加完毕后,可以通过执行 ssh-add -l 验证下,如果都能显示出来和下面一样,就 OK 了。

  1. anin@anin ~ % ssh-add -l
  2. 3072 SHA256:COUusa0tC4CGZwPOoNlBo+pZdskMAvfVDx/25dwQyFo 1119772098@qq.com (RSA)
  3. 3072 SHA256:ewIS7h6u63DZpThpN9CRM/lK5deQwkpe//UfyMccFuc chenglining5747@dingtalk.com (RSA)

这里最近发现了一个问题,解决方案更在这里:mac重启之后ssh-add的记录会丢失

管理密钥

通过以上步骤,公钥、密钥分别被添加到 git 服务器和本地了。下面我们需要在本地创建一个密钥配置文件,通过该文件,实现根据仓库的 remote 链接地址自动选择合适的私钥。
编辑 ~/.ssh 目录下的 config 文件,如果没有,请创建。

  1. vim ~/.ssh/config

配置内容如下:

  1. Host gitee
  2. HostName gitee.com
  3. User anin
  4. IdentityFile ~/.ssh/anin_id_rsa
  5. Host yunxiao
  6. HostName code.aliyun.com
  7. User cln
  8. IdentityFile ~/.ssh/dingtalk_id_rsa

该文件分为多个用户配置,每个用户配置包含以下几个配置项:

Host:仓库网站的别名,随意取
HostName:仓库网站的域名(PS:IP 地址应该也可以)
User:仓库网站上的用户名
IdentityFile:私钥的绝对路径
注: Host 就是可以替代 HostName 来使用的别名,比如我 github 上某个仓库的 clone 地址为:

  1. git@gitee.com:anin/study.git

那么使用 Host 后就是:

  1. git@gitee:anin/study.git

检测

可以用 ssh -T 命令检测下配置的 Host 是否是连通的:

  1. anin@anin .ssh % ssh -T git@gitee
  2. Hi Anin! You've successfully authenticated, but GITEE.COM does not provide shell access.
  3. anin@anin .ssh % ssh -T git@yunxiao
  4. Welcome to GIT, cln!

仓库配置

恭喜你!完成以上配置后,其实你已经基本完成了所有配置。分别进入附属于 github 和 gitlab 的仓库,此时都可以进行 git 操作了。
但是别急,如果你此时提交仓库修改后,你会发现所有提交的用户名变成了你的全局配置。

因此我们需要为每个仓库单独配置用户名信息,假设我们要配置 github 的某个仓库,进入该仓库后,执行:

  1. git config --local user.name "cln"
  2. git config --local user.email "cln@dingtalk.com"

执行完毕后,通过以下命令查看本仓库的所有配置信息:

  1. git config --local --list

至此你已经配置好了 Local 级别的配置了,此时提交该仓库的代码,提交用户名就是你设置的 Local 级别的用户名了。