对多个远程仓库地址自动设置不同的用户名称和邮箱

  1. 问题场景:
  2. 解决方案
  3. 原理
  4. 参考

问题场景:

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

公司仓库要用一组用户名和邮箱,外网仓库要用一组用户名和邮箱
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.gpgsign、user.signingkey.

原理

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

参考


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 chgocn@gmail.com
笔记