基于目录的git配置

221 阅读3分钟
原文链接: www.jianshu.com

Git的强大就不多说了,反正我已经重度依赖git了。

使用git遇到的一个问题是,工作和自己的项目需要使用不同的git配置,如提交者的姓名和邮箱,而git config本身只提供了项目级用户级系统级的配置,并不能满足我的需求。

如果可以在项目级用户级之间再加入一个目录级的配置,就可以很好地解决我的问题,即在工作目录下的所有项目使用工作账号配置,个人目录下的所有项目使用个人账号配置。

- work  # use work config
  + project1
  + project2
- my  # use my config
  + project3
  + project4

那么如何实现一个目录级的配置呢?

首先需要一个前提,就是我们的环境。这一切都是在命令行环境下进行,而我用的是强大的Zsh。Zsh有一个插件autoenv可以在切换目录的时候执行退出旧目录.out)和进入新目录.env)的脚本,这就让我们有机会根据目录的变化来配置当前环境了。

方案一

使用用户级配置替代目录级配置,并在切换目录时根据当前目录修改用户级配置。
文档中可以看到,git的用户级配置就是存在~/.gitconfig里的,在进入目录时切换成当前的~/.gitconfig就相当于修改了目录下所有项目的默认配置。

修改用户级配置可以有以下几种方法:

  • 直接执行命令:git config --global user.name=Gerald
    永久修改了配置文件,如果没机会执行退出脚本,配置将不会复原。
  • 指定不同的文件:mv ~/.gitconfig_awesome ~/.gitconfig
    永久修改了配置文件,如果没机会执行退出脚本,配置将不会复原。
  • 通过环境变量GIT_CONFIG指定config文件
    这样会导致系统级配置失效,副作用比较大。

这几个方法虽然可行,但都有不妥之处。

方案二

通过环境变量覆盖当前的用户配置。
文档中可以看到,git的很多配置是可以通过环境变量覆盖的,比如此处,我们只需要在外层目录下创建.env文件如下:

export GIT_AUTHOR_NAME=Gerald
export GIT_AUTHOR_EMAIL=gerald@example.com
export GIT_COMMITTER_NAME=Gerald
export GIT_COMMITTER_EMAIL=gerald@example.com

再执行命令时就会优先使用环境变量中的配置。

这样的好处的不会污染全局的配置,但是也存在一些问题。首先,git config看到的仍是原来的配置,这会引起一些混乱。而且原来的配置和环境变量并不是一一对应的关系,比如这里原本只需要配置user.nameuser.email,用环境变量则需要配置4个值,而且效果也不完全一样。

方案三

修改git命令,临时加入对应配置。
文档中有说到,git -c key1=value1 -c key2=value2 ...就可以临时加入新的配置。所以只需要在外层目录创建.env文件如下:

alias git='git -c user.name=Gerald -c user.email=gerald@example.com'

即可像原来一样使用git,只是每次输入git命令时,都会通过alias加入上面的配置,达到了修改全局配置的效果,但是并不直接修改全局的配置文件。

再创建.out文件如下:

unalias git

即可在退出目录时恢复配置。 这样就完美解决了基于目录进行配置的问题。