目录

批量修改git仓库历史提交作者信息

今天push的时候看到仓库有些commit是使用公司的邮箱提交的, 需要修改所有历史commit中的提交作者信息

查询网上信息发现了filter-branch脚本, 如下:

#!/bin/sh

git filter-branch --env-filter '

OLD_EMAIL="旧邮箱"
CORRECT_NAME="新名字"
CORRECT_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

修改信息运行后报警告:

WARNING: git-filter-branch has a glut of gotchas generating mangled history
         rewrites.  Hit Ctrl-C before proceeding to abort, then use an
         alternative filtering tool such as 'git filter-repo'
         (https://github.com/newren/git-filter-repo/) instead.  See the
         filter-branch manual page for more details; to squelch this warning,
         set FILTER_BRANCH_SQUELCH_WARNING=1.
Proceeding with filter-branch...

Rewrite 256e869ada89ce0adae33aa01a732c9a71b00992 (1/1) (0 seconds passed, remaining 0 predicted)    
Ref 'refs/heads/master' was rewritten

查询后发现git-filter-branch已被官方弃用, 改用新的基于Python3编写的工具git-filter-repo.

需要通过pip install git-filter-repo安装

之后运行命令:

git filter-repo \
  --email-callback ' return email if email != b"OLD_EMAIL" else b"NEW_EMAIL" ' \
  --name-callback 'return name.replace(b"OLD_AUTHOR", b"NEW_AUTHOR")' \
  --force

经过尝试之后, 发现不论是filter-branch还是git-filter-repo都无法去除远程仓库中的所有提交信息, 在.git中还是会保留, 然而直接删除.git的相关内容会导致某些历史的文件损坏, 所以放弃修改, 除了看commit历史的时候有些不顺眼之外也没什么影响.