批量修改git仓库历史提交作者信息
目录
今天push的时候看到仓库有些commit是使用公司的邮箱提交的, 需要修改所有历史commit中的提交作者信息
filter-branch
查询网上信息发现了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.
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历史的时候有些不顺眼之外也没什么影响.