Git/GitHub配置多用户环境-includeIf用法

1,606 阅读3分钟

写在前面

对于开发者而言,管理多个GitHub账户是常见的需求,尤其是在团队协作或个人拥有多个项目时。众所周知,一个SSH私钥只能绑定到一个GitHub账号。这意味着,当你拥有多个GitHub账户时,你需要为每个账户生成并管理不同的私钥;在这种场景下面临两个问题或痛点:

  1. 如何有效地将这些私钥与对应的GitHub账户关联起来,并确保在不同的账户间能够无缝切换使用?
  2. 如何根据不同账户的仓库,配置不同的user.name和user.email进行提交git commit的区分。

如果你不想修改你的host file 或者ssh config,或者为每个仓库设置一个.gitconfig,那么你可以使用使用.gitconfigincludeIf指令来优雅地管理多个Git身份。

场景描述

假设你有两个GitHub账号,一个用于个人项目,一个用于公司项目。每个账号都有自己的SSH私钥、用户名和邮箱。你希望能够在不同的项目之间无缝切换,而不需要重复配置。

信息如下:

  • 个人账户
    • 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远程操作(如克隆、拉取、推送等)时,使用正确身份信息访问github
  • 进行gitcommit提交时,使用正确的user和email等信息

环境

本文操作的系统为MacOS,对于Linux应该没差别, Windows环境可能在路径格式上不一样。

配置步骤

  1. 打开你的全局Git配置文件${HOME}/.gitconfig
  2. 添加或修改用户信息,指定默认的SSH私钥。
  3. 使用includeIf指令,根据不同的条件(比如仓库URL)包含特定的配置文件。

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 中的includeIf可以有条件地包含其他配置文件。

示例配置

[user]
  email = dt@gmail.com
  name = dt

[core]
  sshCommand = ssh -i ${HOME}/.ssh/id_rsa_cm

# remote为`git@github.com:cm`的仓库中,使用下面的git配置信息
[includeIf "hasconfig:remote.*.url:git@github.com:cm/**"]
  path = ~/.gitconfig_cm
  
# 本示例中,可选
# 因为~/.gitconfig_dt中的配置项与主配置项相同
[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

最终效果

  • 在remote为github.com/dt/的git仓库下所有操作和github身份认证,使用个人账户的信息
  • 在remote为github.com/cm/的git仓库下所有操作和github身份认证,使用公司账户的信息
  • 其他所有的git仓库操作,使用默认账户的信息

更多方式

includeIf的可判断条件,除了remote之外,还可以进行目录gitdir的判断。可以灵活的按照个人规划,管理git多账号的场景。

可能遇到的问题及解决方式

  • 如果你在使用ssh agent时遇到了问题,比如agent中只包含了一个私钥,你可以尝试将另一个私钥添加到agent中,或者完全不使用ssh agent

总结

通过上述配置,你可以轻松地在不同的Git身份之间切换,无需手动更改设置。这种方法不仅提高了工作效率,还减少了配置错误的可能性。赶快尝试这种方法,让你的Git多身份管理变得简单而优雅。

本文虽然经过了仔细的校对和测试,但难免会有疏漏之处。如果你在尝试应用这些配置时遇到了问题,或者发现了任何错误,欢迎你提出来,我会非常感激。 此外,如果你有任何改进建议,或者有其他更高效的方法来管理Git多身份,让我们一起交流,共同进步。