竹杖芒鞋轻胜马,一蓑烟雨任平生

git如何修改历史commit的用户名和邮箱

进入目标git仓库,将以下脚本中的YOUR_NAME和YOUR_EMAIL替换成自己的用户名和邮箱,保存为脚本执行。

之后本地的git提交历史中所有的用户名和邮箱将被替换成你所需要的。

注:master可能无法直接push到远端仓库,可将远端仓库删除重建。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/sh
git filter-branch -f --env-filter '
CORRECT_NAME="YOUR_NAME"
CORRECT_EMAIL="YOUR_EMAIL"
export GIT_COMMITTER_NAME="$CORRECT_NAME"
export GIT_COMMITTER_EMAIL="$CORRECT_EMAIL"
export GIT_AUTHOR_NAME="$CORRECT_NAME"
export GIT_AUTHOR_EMAIL="$CORRECT_EMAIL"
' --tag-name-filter cat -- --branches --tags

或者如果是多人参与的项目,只是想改一部分用户名的话,可以用下面的脚本。替换YOUR_OLD_EMAIL、YOUR_NAME、YOUR_EMAIL。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/bin/sh
git filter-branch --env-filter '
OLD_EMAIL="YOUR_OLD_EMAIL"
CORRECT_NAME="YOUR_NAME"
CORRECT_EMAIL="YOUR_EMAIL"
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