如何修改Git中多个提交记录的作者信息与邮箱?
修改指定提交记录的作者信息
我曾需要修改Git仓库中特定作者的提交记录,搜索后发现常见方案是用git filter-branch和git filter-repo,但这两个工具都有明显局限:
git filter-branch:速度极慢,还会修改多分支中的同一提交,不符合需求,实用性差。git filter-repo:功能虽好,但Ubuntu 20.04 LTS不支持,需要升级系统才能使用,兼容性受限。
我的解决方案
initialCommit=$(git log original-branch --format=format:"%h" | tail -1) readarray -t commitsArray < <(git log original-branch --author="Original Author <originalauthor@email.com>" --format=format:"%h") startCommitIndex=$(("${#commitsArray[@]}"-1)) git checkout -b new-branch "$initialCommit" if [[ "$initialCommit" == "${commitsArray[$startCommitIndex]}" ]]; then git commit --amend --author "New Author <newauthor@email.com>" startCommitIndex=$(($startCommitIndex - 1)) fi for (( commitIndex=$startCommitIndex; commitIndex >= 0; commitIndex-- )); do git cherry-pick "${commitsArray[$commitIndex]}" git commit --amend --author "New Author <newauthor@email.com>" done
方案原理说明
核心命令基础
git commit --amend --author "New Author <newauthor@email.com>":专门用来修改当前HEAD指向的最新提交记录的作者信息。git log的哈希格式选项:--format=format:"%H":获取提交的完整40字符哈希值--format=format:"%h":获取提交的短哈希值(长度在7-9字符之间,根据仓库提交历史数量自动调整),Git可以通过短哈希唯一识别对应提交。
脚本步骤拆解
- 获取原分支最早的初始提交哈希值,作为新分支的起点
- 筛选出目标作者的所有提交哈希,并存入数组中
- 创建新分支并直接切换到初始提交节点
- 检查初始提交是否属于目标作者,若是则直接修改其作者信息
- 反向遍历目标提交数组,通过
git cherry-pick将每个提交内容合并到新分支,随后立即修改该新生成提交的作者信息
后续收尾操作
修改完成后,可执行以下命令替换原分支:
git branch -D original-branch git branch -m new-branch original-branch
确认所有修改无误后,即可推送到GitHub、GitLab等远程仓库完成操作。
内容的提问来源于stack exchange,提问作者Dennis
相关产品推荐
相关产品推荐

