github多身份Git管理-优雅的配置方式
github多身份Git管理-优雅的配置方式
Git多身份管理一直是一个“痒点”,一些方法,比如:
- 修改 
.ssh/config - 项目目录里 
git config - 不同的认证方式(.e.g https 和 ssh 分别对应不同的环境;git 和 gh)
 - … …
 
某种程度上可以处理多身份的问题,但我认为这些方式都不够灵活和“优雅”。
今天偶遇了一种方式,使用 .gitconfig中的 inclueIf ,可以完美解决这个问题,我觉得很棒,足够灵活且提供了更多可能性。
不得不说,Git 真的很强大,用了很多年,依然不够了解它!
场景
有两个GitHub账号,一个是公司的账户,一个是个人项目的账户。分别对应的ssh 私钥为id_rsa_cm和id_rsa_dt。
信息如下:
- 个人账户
- key:id_rsa_dt
 - user.name: dt
 - email: dt@gmail.com
 - repos: github.com/dt/xxx.git
 
 - 公司账户
- key:id_rsa_cm
 - user.name: cm
 - email:cm@cm.com
 - repos: github.com/cm/xxx.git
 
 
目标
进行项目的git操作(clone、pull、push…)时,分别使用各自的配置。
环境
操作的系统为MacOS,对于Linux应该没差别, Windows环境可能在路径格式上不一样而已。
配置
Git 的全局配置文件是  ${HOME}/.gitconfig , 如果进行过诸如 git config user.name "dt"   等这样的命令,文件里的内容可能如下:
$ cat ~/.gitconfig
[user]
  name = dt
	email = dt@gmail.com
	
配置文件中还有一些配置项,可以对 git的命令和行为进行定制,比如 core.sshCommand
[core]
	sshCommand = ssh -i ${HOME}/.ssh/id_rsa
另外,.gitconfig 文件有一个很棒的功能,可以有条件地包含其他配置文件。
两者结合,为多身份管理提供里技术支持。
下面是最终的配置(已脱敏)
# config: ~/.gitconfig
[user]
	email = dt@gmail.com
	name  = dt
	
[core]
	sshCommand = ssh -i ${HOME}/.ssh/id_rsa_cm
[includeIf "hasconfig:remote.*.url:git@github.com:cm/**"]
    path = ~/.gitconfig_cm
    
# 本案例中,下面的配置与全局配置相同,可选
[includeIf "hasconfig:remote.*.url:git@github.com:dt/**"]
    path = ~/.gitconfig_dt
个人账户配置文件(可选,视配置文件而定)
# config: ~/.gitconfig_dt
[user]
	email = dt@gmail.com
	name  = dt
[core]
	sshCommand = ssh -i ${HOME}/.ssh/id_rsa_dt
公司账号配置文件
# config: ~/.gitconfig_cm
[user]
	email = cm@cm.com
	name  = cm
[core]
	sshCommand = ssh -i ${HOME}/.ssh/id_rsa_cm
这个方法完美的解决我遇到的问题,还可以处理更多更复杂的场景,比如,我还可以对 gitee 的平台使用国内的邮箱。
includeIf
有条件的包含其他配置文件的方式,可以有多种条件
gitdirgitdir/ionbranchhasconfig:remote.*.url:
具体请参考https://git-scm.com/docs/git-config
Git - git-config Documentation
可能遇到的问题
- 遇到 
ssh agent会有bug:比如上面的场景,两个key, 但agent中只有id_rsa_dt, 会发现进行公司项目与github交互时,使用的key并不是id_rsa_cm,而是id_rsa_dt;解决方法也很简单:agent中加入id_rsa_cm或者不使用ssh agent 
转载自:https://juejin.cn/post/7351439648592658495