问题场景:
所有需要针对不同的仓库设置不同的用户名称或者用户邮件的场景。包括但不限于:
公司仓库要用一组用户名和邮箱,外网仓库要用一组用户名和邮箱
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