相信很多人经历过与我类似的困扰,工作和业余项目的作者信息相互干扰。
具体来说,就是希望工作项目都使用工作邮箱作为 user.email
的配置,而业余项目都使用个人邮箱作为user.email
的配置,user.name
字段同理。
因为有两套不同的作者信息,所以就需要有两套不同的Git配置。
但是因为 Git 的全局配置只能有一套,所以就只能在各个项目中单独配置至少一方的配置文件,比较麻烦且容易出错。
我设想的方案是这样的:
- 通过目录结构将Git仓库分组。如工作项目检出到
~/work/<子目录>
下,而业余项目检出到~/personal/<子目录>
下。 - 为每个目录单独保存一份全局配置。
如果这个方案可行的话,只需要将Git仓库检出到相应的子目录之中,就可以自动应用正确的全局配置,无需再为每个仓库单独配置。
经过一番搜索,我在 StackOverflow 中找到了为每个目录单独保存一份全局配置的方案,那就是 conditional_includes。
原理很简单,就是在Git的全局配置(如 Mac / Linux 系统中的 ~/.gitconfig
文件)中,使用 includeIf
关键字和一些条件做判断,如果符合条件,就会载入相应的配置。
举个例子说明具体的用法
假如需要设置 ~/work/
下所有的Git仓库的默认作者为“小猪佩奇”,而 ~/personal/
下所有的Git仓库的默认作者为“小马宝莉”,则可以编辑 ~/.gitconfig
文件,添加如下的内容:
[includeIf "gitdir:~/work/"]
path = ~/work/.gitconfig
[includeIf "gitdir:~/personal/"]
path = ~/personal/.gitconfig
同时在 ~/work/
和 ~/personal/
目录下各创建一个 .gitconfig
文件(文件名随意,但要和上面的 path 对应上)。
# ~/work/.gitconfig 文件
[user]
name = 小猪佩奇
# ~/personal/.gitconfig 文件
[user]
name = 小马宝莉
这样一来就完成了。
为了简化上述的流程,我创建了一个工具 git-dir-config,自动管理上面的流程,这样就可以简化操作为:
cd ~/work && git dir-config user.name 小猪佩奇
cd ~/personal && git dir-config user.name 小马宝莉
使用之前需要先全局安装这个npm包:
npm i -g git-dir-config