如何批量修改多个提交的作者和邮箱
批量改提交作者/邮箱:推荐 git filter-repo --email-callback / --name-callback 重写全历史;老工具 git filter-branch --env-filter 可按旧邮箱条件替换。重写后需强推,协作者需重新克隆。
推荐 git filter-repo(filter-branch 的现代替代,快且安全):按条件把历史中的作者/提交者邮箱批量替换。典型场景:误用公司邮箱提交了一堆个人项目,或换邮箱后统一历史署名。
filter-repo 方式(推荐)
pip install git-filter-repo
# 按旧邮箱替换作者与提交者
git filter-repo --email-callback '
return email.replace(b"old@company.com", b"new@example.com")
'
# 同时改名字
git filter-repo --name-callback '
return name.replace(b"Old Name", b"New Name")
'
操作的是整个仓库历史,执行前建议在全新克隆上做。
只改最近 N 个提交
git rebase -i HEAD~5 --exec 'git commit --amend --author="New <new@example.com>" --no-edit'
--exec 让 rebase 每停一个提交就执行一次 amend。
推送与善后
git push --force-with-lease --all
git push --force-with-lease --tags
- 所有协作者必须重新克隆(旧克隆里的历史已作废);
- GitHub 上提交与账号的关联按邮箱匹配,改对了头像和贡献统计会自动恢复。
常见问题(FAQ)
Q:filter-branch 和 filter-repo 用哪个?
filter-repo。filter-branch 官方已标记为不推荐(慢、易误用),新系统默认不带。
Q:能只改某个提交范围的作者吗?
rebase --exec 方式适合最近几个;历史上分散的提交用 filter-repo 的条件回调(判断 email/日期)更可靠。
Q:改完 GitHub 上还是旧邮箱?
推送后稍等刷新;确认改的是 author 和 committer 两者(filter-repo 的 email-callback 同时处理两者)。