当一个git repo没有被推向远程服务器时,我们有机会能够改变本地的全部提交者信息。如果你使用多个id分别做不同的工作的话,这个方法或许是有用的。

按照 Stack Overflow 上 How to change the author and committer name and e-mail of multiple commits in Git? 的方法,下面有一个 bash 脚本,你可以命名为 git-apply-xxx.sh 并发到 /usr/local/bin 中去,然后用 BAD_NAME=my-wrong-name NAME=my-right-name EMAIL=my-right-email@xxx git-apply-xxx.sh 来批量修改所有的提交的作者到新的id上面去。

#!/bin/sh

git filter-branch --env-filter "
OLD_EMAIL=${BAD_NAME:-your-old-email@example.com}
CORRECT_NAME=${NAME:-Your Name}
CORRECT_EMAIL=${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

 

如果你喜欢直接在命令行上编辑命令,下面这个简单一点的命令行或许更适合你(不过我没使用过,请事先备份):

git filter-branch --commit-filter '
        if [ "$GIT_COMMITTER_NAME" = "<Old Name>" ];
        then
                GIT_COMMITTER_NAME="<New Name>";
                GIT_AUTHOR_NAME="<New Name>";
                GIT_COMMITTER_EMAIL="<New Email>";
                GIT_AUTHOR_EMAIL="<New Email>";
                git commit-tree "$@";
        else
                git commit-tree "$@";
        fi' HEAD

 

总而言之,上面的方法都是很有破坏性的,你可能需要事先完整地复制整个工作目录到另一处建立备份之后再来使用,我的经验说,很多时候还是会出现古怪的问题:大体上你会看到提交者信息被修订了,有时候你会发现双重的提交,原始的不变,新增一整套,尤其是你推送过其中一部分提交的话。

所以,再次提醒,首先完整副本,然后应用脚本,然后检查git log确认动作正确。