gitconfig文件

gitconfig 顾名思义就是 git 的配置文件,一般我们在使用 git 的过程中,接触不到这个文件。直到有一次我和一个朋友(后文称作老王,其实人家不老😅)共用一个服务器时,发现我的 blog 提交历史中显示的用户名是老王的邮箱和头像,我才慢慢开始接触到这个文件。

事情起因

我和老王共用了一台服务器来搭建我们各自的博客系统,blog 都是采用 hexo 搭建,由于 hexo 默认使用全局的 git 用户名和邮箱配置,以至于在老王运行过 git config –global user.name “xxx” 及 git config –global user.email “xxx@yyy” 之后,我们两个的的提交都使用了这个全局的配置,我的 git 仓库的提交历史也自然变为了他的名字。

找寻原理

于是我开始查找 git config –global user.x “y” 到底做了什么,原来这个命令是做了一个写配置项事情(如果不加”y”则读相应的配置项)当我运行这个命令时,会自动往 ~/.gitconfig 文件增加配置项,没有这个文件的话会自动创建,让我们认识下这个文件

image.png

由于我只 config 过 user 相关的选项所以这里只添加了 user 的配置。
除了 –global 之外,我们还可以 git config –system 添加系统级别的 git 配置,保存在 /etc/gitconfig 文件中,
此外,每个项目也可以有自己单独的 gitconfig 配置文件,存放于项目 .git/config 文件中,我们可以在 .git 目录下手动创建也可以直接 git config user.name ‘xxx’,以这种命令行的形式添加配置(执行该命令需注意两点:1. 需在 git 项目目录下, 不一定是根目录,2. 不加 –global or –system), 然后查看下配置文件

image.png

发现我们的用户名已经写入,并且还可以看到这个项目其他的一些 git 默认配置项,比如 core, 可以通过 git config core.xxx 进行修改。
不难想到,在项目中进行提交的时候,优先会采用项目内的 git 变量配置,项目内没有接着找全局的,全居的没有再找系统级别的,采用就近原则。每一个级别的配置都会覆盖上层的相同配置(同名变量)。

问题解决

找到问题所在,我们商量后注释了全局配置文件内的用户名邮箱,在各自项目的 .deploy_git 文件夹下的 .git/config 文件内添加了各自的用户配置,至此,再提交问题得到完美解决。
这只是解决了新的历史记录的问题,旧的历史记录还是老王的信息,可以通过下面脚本批量修正

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/bin/sh

git filter-branch --env-filter '
OLD_EMAIL="your-old-email@example.com"
CORRECT_NAME="Your Correct Name"
CORRECT_EMAIL="your-correct-email@example.com"
if [ "$GIT_COMMITTER_EMAIL" = "$OLD_EMAIL" ]
then
export GIT_COMMITTER_NAME="$CORRECT_NAME"
export GIT_COMMITTER_EMAIL="$CORRECT_EMAIL"
fi
if [ "$GIT_AUTHOR_EMAIL" = "$OLD_EMAIL" ]
then
export GIT_AUTHOR_NAME="$CORRECT_NAME"
export GIT_AUTHOR_EMAIL="$CORRECT_EMAIL"
fi
' --tag-name-filter cat -- --branches --tags