鱼肚的博客

技术宅改变世界

多套Git全局配置并存方案

背景

相信很多人经历过与我类似的困扰,工作和业余项目的作者信息相互干扰。

具体来说,就是希望工作项目都使用工作邮箱作为 user.email的配置,而业余项目都使用个人邮箱作为user.email的配置,user.name字段同理。

因为有两套不同的作者信息,所以就需要有两套不同的Git配置。

但是因为 Git 的全局配置只能有一套,所以就只能在各个项目中单独配置至少一方的配置文件,比较麻烦且容易出错。

解决方案

我设想的方案是这样的:

  1. 通过目录结构将Git仓库分组。如工作项目检出到 ~/work/<子目录> 下,而业余项目检出到 ~/personal/<子目录>下。
  2. 为每个目录单独保存一份全局配置。

如果这个方案可行的话,只需要将Git仓库检出到相应的子目录之中,就可以自动应用正确的全局配置,无需再为每个仓库单独配置。

经过一番搜索,我在 StackOverflow 中找到了为每个目录单独保存一份全局配置的方案,那就是 conditional_includes

原理很简单,就是在Git的全局配置(如 Mac / Linux 系统中的 ~/.gitconfig 文件)中,使用 includeIf 关键字和一些条件做判断,如果符合条件,就会载入相应的配置。

实例

举个例子说明具体的用法

假如需要设置 ~/work/ 下所有的Git仓库的默认作者为“小猪佩奇”,而 ~/personal/ 下所有的Git仓库的默认作者为“小马宝莉”,则可以编辑 ~/.gitconfig文件,添加如下的内容:

1[includeIf "gitdir:~/work/"]
2    path = ~/work/.gitconfig
3[includeIf "gitdir:~/personal/"]
4    path = ~/personal/.gitconfig

同时在 ~/work/~/personal/ 目录下各创建一个 .gitconfig 文件(文件名随意,但要和上面的 path 对应上)。

1# ~/work/.gitconfig 文件
2[user]
3    name = 小猪佩奇
1# ~/personal/.gitconfig 文件
2[user]
3    name = 小马宝莉

这样一来就完成了。

工具固化

为了简化上述的流程,我创建了一个工具 git-dir-config,自动管理上面的流程,这样就可以简化操作为:

1cd ~/work && git dir-config user.name 小猪佩奇
2cd ~/personal && git dir-config user.name 小马宝莉

使用之前需要先全局安装这个npm包:

1npm i -g git-dir-config