如何批量修改Git中已推送的多笔提交的作者信息?
批量修改Git提交的作者信息
当然可以批量修改提交的作者信息,无需逐个操作;也能指定提交范围只修正错误作者的提交,之后用git push --force-with-lease更新远程master分支,以下是具体方法和注意事项:
一、批量修改所有错误作者的提交
推荐使用git filter-repo(Git官方已弃用git filter-branch,后者存在性能和安全问题),操作前务必备份本地仓库(复制整个文件夹即可),避免数据丢失。
1. 修正指定错误邮箱/用户名的所有提交
执行以下命令,将错误的作者信息替换为正确内容:
git filter-repo --mailmap <(echo "正确姓名 <正确邮箱> 错误姓名 <错误邮箱>")
如果只需要修正邮箱,不需要修改姓名,可以用:
git filter-repo --email-callback 'return b"正确邮箱" if email == b"错误邮箱" else email'
二、指定提交范围修改(仅修正夹杂在其他提交中的错误作者记录)
如果只需要修改某一段提交范围内的错误作者信息,且保留其他作者的提交不变,可以用带条件判断的git filter-repo命令:
- 先确定要修改的提交范围,比如要修改从提交
abc123到当前HEAD的所有提交(abc123是范围起始提交的父提交哈希); - 执行以下命令,仅替换错误邮箱对应的作者信息:
git filter-repo --commit-filter ' if [ "$GIT_AUTHOR_EMAIL" = "错误邮箱" ]; then GIT_AUTHOR_NAME="正确姓名" GIT_AUTHOR_EMAIL="正确邮箱" # 同时修正提交者信息(如果需要的话) GIT_COMMITTER_NAME="$GIT_AUTHOR_NAME" GIT_COMMITTER_EMAIL="$GIT_AUTHOR_EMAIL" fi git commit-tree "$@" ' --refs refs/heads/master --not abc123
--not abc123表示只处理abc123之后的提交,不会影响之前的历史。
三、推送修改后的历史到远程master
修改完成后,需要强制推送更新远程分支,推荐使用--force-with-lease(比--force更安全,会检查远程分支是否有你未同步的新提交,避免意外覆盖他人工作):
git push --force-with-lease origin master
重要注意事项
- 修改提交历史是破坏性操作,必须提前告知团队所有成员,让他们暂停在该分支的工作;
- 其他成员在你推送后,需要同步本地仓库:先执行
git fetch origin,再用git reset --hard origin/master(注意:此操作会清除本地未提交的修改,需提前备份); - 如果远程分支有其他人的新提交,修改前要先拉取合并,否则强制推送会覆盖这些提交。
内容的提问来源于stack exchange,提问作者user16891224
相关产品推荐
相关产品推荐

