使用 git filter-repo 统一提交作者信息(修复常见逻辑问题)

在使用 git filter-repo 重写 Git 历史时,很多人会遇到一个隐蔽但常见的逻辑问题

  • 只修改了 author_namecommitter_name
  • 作者(author)和提交人(committer)被设置成了不同的名字
  • 只匹配了一个邮箱,导致另一部分提交没有被修改

本文将给出一个正确、可复用的方案:

只要邮箱匹配 xxxxxx@163.com,就把作者和提交人统一改成 michah(名字和邮箱都可统一)。


一、问题背景

在 Git 中,一次提交包含两套身份信息:

  • Author(作者):实际编写代码的人
  • Committer(提交人) :执行 git commit 的人

它们分别对应:

  • author_name / author_email
  • committer_name / committer_email

如果在脚本中只修改其中一个,或者给两者设置了不同的名字,就会导致历史记录混乱。


二、正确目标

目标非常明确

  • 只要提交中的邮箱是 xxxxxx@163.com
  • 无论是 author 还是 committer
  • 统一修改为:
text 复制代码
michah <michah@example.com>

(如果你想保留原邮箱,只改名字,也可以做到,后文会说明)


三、修正后的 git-filter-repo 脚本(推荐)

bash 复制代码
git filter-repo --force --commit-callback '
    target_email = b"xxxxxx@163.com"
    new_name = b"michah"
    new_email = b"michah@example.com"  # 可选,也可保持原邮箱

    if commit.author_email == target_email:
        commit.author_name = new_name
        commit.author_email = new_email

    if commit.committer_email == target_email:
        commit.committer_name = new_name
        commit.committer_email = new_email
'

关键点说明

  • 只判断邮箱,不判断名字(邮箱才是稳定标识)
  • author 和 committer 分别独立判断、分别修改
  • 名字和邮箱保持一致,避免历史中出现"一个人多个身份"

四、如果你只想改名字,不改邮箱

把脚本中的这一行:

python 复制代码
new_email = b"michah@example.com"

改成:

python 复制代码
new_email = target_email

即可。


五、修改前 vs 修改后对比

字段 修改前 修改后
author_name xingming michah
author_email xxxxxx@163.com michah@example.com
committer_name 其他名字 michah
committer_email xxxxxx@163.com michah@example.com

六、修改完成后的校验方式(非常重要)

执行以下命令,确认历史中不再出现旧身份:

bash 复制代码
git log --format='%an <%ae>' | sort | uniq
bash 复制代码
git log --format='%cn <%ce>' | sort | uniq

如果输出中只剩下 michah,说明修改是成功的。


七、设置当前仓库的默认提交用户

⚠️ 注意:这一步 不会影响历史提交 ,只作用于未来的提交

bash 复制代码
git config user.name "michah"

如果你希望对当前用户下的所有仓库生效:

bash 复制代码
git config --global user.name "michah"
git config --global user.email "michah@example.com"

八、重要提醒

  • git filter-repo重写整个仓库历史
  • 如果仓库已经推送到远程,需要:
bash 复制代码
git push --force --all
git push --force --tags
  • 协作仓库请提前沟通,避免影响他人

九、总结

✔ 用邮箱作为唯一判断条件

✔ author / committer 必须同时处理

✔ 名字和邮箱保持统一

这是最干净、最不容易出问题的 Git 历史重写方式。

相关推荐
小龙11 小时前
[Git 报错解决]本地分支落后于远程分支(`non-fast-forward`)
大数据·git·elasticsearch·github
爱敲代码的婷婷婷.12 小时前
git 指定版本回退、临时保存 等操作
git
闲云一鹤13 小时前
Git 焚决!一个绝招助你找回丢失的代码文件!
前端·git
DKunYu13 小时前
2.分支管理
大数据·git·elasticsearch·搜索引擎·gitee
DKunYu14 小时前
1.基本操作
git·gitee
小龙14 小时前
【Git 报错解决】SSH 公钥认证失败(`Permission denied (publickey)`)
运维·git·ssh
哆啦code梦15 小时前
Git Flow架构图解:分支策略全解析
git·git flow·分支策略
Albert Edison15 小时前
【Git】远程操作
git·svn·github
脾气有点小暴16 小时前
Git指令大全(常见版)
前端·git
DKunYu17 小时前
3.远程操作
大数据·git·elasticsearch·搜索引擎·gitee