如何批量修改多个提交的作者和邮箱
批量改提交作者/邮箱:推荐 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 b"new@example.com" if email == b"old@company.com" else email
' --name-callback '
return b"New Name" if name == b"Old Name" else name
'
默认会改写所处理的历史,执行前在全新克隆上做,并保存待更新引用的旧远端提交。email/name 回调也可能修改 tagger;只改 author 时需使用 commit callback。filter-repo 通常移除 origin,推送前核对并恢复正确地址。
只改最近 N 个提交
git rebase -i HEAD~5 --exec 'git commit --amend --author="New <new@example.com>" --no-edit'
--exec 让 rebase 每停一个提交就执行一次 amend。
推送与善后
# 每个已审阅引用单独推送,<旧SHA> 必须是改写前核对的远端值
git push --force-with-lease=refs/heads/main:<旧SHA> origin HEAD:refs/heads/main
- 协作者需要迁移到新历史;可重新克隆,或先保全本地工作再协调重放,避免旧历史再次推回;
- 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 同时处理两者)。