Skip to content

Git 批量修改提交邮箱

场景

当需要批量修改仓库中所有提交的 user.email 时(如换邮箱、配置错误等),可以使用 git filter-branch 命令重写历史。

方法一:使用 git filter-branch

bash
# 设置环境变量防止警告
export FILTER_BRANCH_SQUELCH_WARNING=1

# 批量修改所有提交的邮箱
git filter-branch -f --env-filter '
if [ "$GIT_AUTHOR_EMAIL" = "旧邮箱" ]; then
    export GIT_AUTHOR_EMAIL="新邮箱";
fi;
if [ "$GIT_COMMITTER_EMAIL" = "旧邮箱" ]; then
    export GIT_COMMITTER_EMAIL="新邮箱";
fi
' -- --all

方法二:使用 Python 脚本

python
import subprocess
import os

old_email = '旧邮箱'
new_email = '新邮箱'

os.environ['FILTER_BRANCH_SQUELCH_WARNING'] = '1'

cmd = [
    'git', 'filter-branch', '-f',
    '--env-filter',
    f'if [ "$GIT_AUTHOR_EMAIL" = "{old_email}" ]; then export GIT_AUTHOR_EMAIL="{new_email}"; fi; if [ "$GIT_COMMITTER_EMAIL" = "{old_email}" ]; then export GIT_COMMITTER_EMAIL="{new_email}"; fi',
    '--', '--all'
]

subprocess.run(cmd, capture_output=True)

验证

bash
# 检查所有提交的邮箱
git log --all --format="%ae" | Sort-Object -Unique

# 查看最近提交
git log --oneline -5

清理备份

bash
# 删除 filter-branch 创建的备份引用
git update-ref -d refs/original/refs/heads/master
git reflog expire --expire=now --all

注意事项

  1. 未 push 才能使用 - 重写历史会改变 commit SHA,已push的需要强制 push
  2. 备份重要性 - 建议操作前确认没有重要数据未备份
  3. 仓库权限 - 确保有仓库的管理权限

Released under the MIT License.