多个远程仓库, 如何自动设置不同邮箱或用户名

之前在公司的问答平台上解答了一个有关 git 多个远程仓库需要制定不用用户名或者用户邮箱的问题。原本以为是随口一答的问题,没想到之后该回答连续几个月一直有新增的点赞,说明会遇到这个问题的人还不少。所以把答案整理一下也发在博客一份。

问题场景:

所有需要针对不同的仓库设置不同的用户名称或者用户邮件的场景。包括但不限于:

  • 公司仓库要用一组用户名和邮箱,外网仓库要用一组用户名和邮箱
  • github 的仓库要用一组邮箱(github 用来保护用户隐私的邮箱)、gitlab 的仓库要用另一组邮箱
  • ……

有人说,我可以在项目仓库下 git config user.email 针对单个仓库设置啊。是的,可以,但是当你有大量的仓库需要管理的时候,你就会感到痛苦了。我们要达到的目标是做一次性的设置,以后新建仓库都会自动适用对应的信息,不只限于 "user.name" 和 "user.email".

解决方案

前提条件:git客户端版本大于 2.13

首先,假设:

  • 你已经全局配置了公司邮箱和名称
    • user.name = xxxxx,
    • user.email = xxxxx@company.com
  • 你在 E:\codes 下存放所有的 git repos。
  • 现在你要为 gitlab 和 github 分别设置不同的用户邮箱:
    • Gitlab: "12365-user@users.noreply.gitlab.com"
    • Github: "23424+user@users.noreply.github.com"

现在建立两个特殊的目录:

E:\codes 
├── gitlab // 专门用于存放托管在 gitlab 的代码仓库 
├── github // 专门用户存放托管在 github 的代码仓库 

打开git的全局配置文件(一般是在 C:\Users\{用户名}\.gitconfig, Mac 下是在 /Users/{用户名}/.gitconfig),增加两段配置,如下(第 5 行起的部分):

  [user]
      name = xxxxx
      email = xxxxx@company.com

+ [includeIf "gitdir:codes/github/"]
+    path = ./.github
+
+ [includeIf "gitdir:codes/gitlab/"]
+    path = ./.gitlab

在全局 .gitconfig 文件夹相同的位置,创建 .github.gitlab 文件,内容如下:

# .github
[user]
    email = 23424+user@users.noreply.github.com
# .gitlab
[user]
    email = 12365-user@users.noreply.gitlab.com

这样配置以后,如果你是在 E:\codes\gitlab 下的某个项目时,你的 email 是 12365-user@users.noreply.gitlab.com,如果你是在 E:\codes\github 下的某个项目时,你的 email 是 23424+user@users.noreply.github.com,其它情况下,是 xxxxx@company.com.

当然除了 user.email 之外,你也可以针对性地指定其它配置项,包括但不限于 commit.gpgsignuser.signingkey.

原理

以上方法使用到的其实是 git 本身的 "Conditional Includes" 功能,根据不同的情况包含不同的配置文件。这里用到的是基于路径的条件。

有关于 "Conditional Includes" 的更多介绍,请查阅官方文档