git的一些方便配置以及修改历史信息

根据不同环境来自动变更git的设置

从git的2.13版本开始,提供了includeIf字段来区分不同的git config文件
这样做的好处在于,可以区分个人项目和公司项目,配置不同的提交人信息

  1. 在home目录下建.gitconfig文件,代表全局配置的,这里面不要写user的字段信息,这部分信息由其他文件提供
  2. 在其余目录生成个人或者公司项目的配置文件,可以随便取名
  3. 设置includeIf的字段信息,配置不同的文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 主要的.gitconfig内容,具体路径的问题可以修改,指向不同的目录,path指向也可以指向不同目录下的文件,相对路径和绝对路径都可以
[includeIf "gitdir:~/work/personal/"]
path = .gitconfig-personal
[includeIf "gitdir:~/work/github/"]
path = .gitconfig-github
...


# .gitconfig-personal文件内容
[user]
name = xxx
email = xxx@xxx.com

# .gitconfig-github文件内容
[user]
name = xxx2
email = xxx2@xxx2.com

修改以前的提交信息

直接在需要修改的git库下执行即可,然后执行git push --force

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="old-email@email.com"
CORRECT_NAME="xxx"
CORRECT_EMAIL="xxx@new-email.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
' HEAD
  • 这里HEAD代表所有提交记录

gitlab的提交权限问题

以上修改完后,需要强行覆盖到远程分支上,这里需要注意的是,如果提交的分支是收到保护的分支,那么会报错

1
2
3
4
remote: GitLab: You are not allowed to force push code to a protected branch on this project.
To gitlab.dmall.com:devops/cloud-gateway.git
! [remote rejected] master -> master (pre-receive hook declined)
error: failed to push some refs to 'git@gitlab.dmall.com:devops/cloud-gateway.git'
  • 可以在gitlab上把这个git库的分支受保护关掉
  • 具体可以在gitlab上查看,repository->Branches->projects settings->Protected Branch->关闭当前分支