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注意事项
- 未 push 才能使用 - 重写历史会改变 commit SHA,已push的需要强制 push
- 备份重要性 - 建议操作前确认没有重要数据未备份
- 仓库权限 - 确保有仓库的管理权限