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
有条件的包含其他配置文件的方式,可以有多种条件
gitdir
gitdir/i
onbranch
hasconfig: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