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.name
和user.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
即可在退出目录时恢复配置。
这样就完美解决了基于目录进行配置的问题。
网友评论