Git历史提交记录修改求助:指定时间后邮箱替换脚本失效
问题与解决方法
需求
- 修改历史提交中的邮箱:将
jiangyg@akulaku.com和candra@bankneo.co.id替换为指定邮箱 - 仅修改2021-12-22之后的提交记录
原脚本问题
你之前的脚本存在三个核心问题:
- 时间戳获取错误:
git show -s --format="%ct" $GIT_COMMITTER_DATE中$GIT_COMMITTER_DATE是日期字符串,不是提交哈希,无法用来获取时间戳,应该用当前提交的哈希$GIT_COMMIT。 - 语法错误:
[ "$GIT_COMMITTER_EMAIL" = "$OLD_EMAIL"]缺少空格,Shell中括号两边必须有空格。 - 未处理两个旧邮箱,只针对了单个邮箱。
修正后的脚本
# 预计算2021-12-22的时间戳,避免重复执行date命令 TARGET_TIMESTAMP=$(date -d "2021-12-22" +%s) git filter-branch -f --env-filter " # 存储需要替换的旧邮箱数组 OLD_EMAILS=('jiangyg@akulaku.com' 'candra@bankneo.co.id') CORRECT_NAME='jiangyangang' CORRECT_EMAIL='candra@bankneo.co.id' # 获取当前提交的时间戳 COMMIT_TIMESTAMP=\$(git show -s --format='%ct' \"\$GIT_COMMIT\") # 先判断提交时间是否在目标日期之后 if [ \"\$COMMIT_TIMESTAMP\" -gt \"$TARGET_TIMESTAMP\" ]; then # 替换提交者信息 for OLD_EMAIL in \"\${OLD_EMAILS[@]}\"; do if [ \"\$GIT_COMMITTER_EMAIL\" = \"\$OLD_EMAIL\" ]; then export GIT_COMMITTER_NAME=\"\$CORRECT_NAME\" export GIT_COMMITTER_EMAIL=\"\$CORRECT_EMAIL\" break fi done # 替换作者信息 for OLD_EMAIL in \"\${OLD_EMAILS[@]}\"; do if [ \"\$GIT_AUTHOR_EMAIL\" = \"\$OLD_EMAIL\" ]; then export GIT_AUTHOR_NAME=\"\$CORRECT_NAME\" export GIT_AUTHOR_EMAIL=\"\$CORRECT_EMAIL\" break fi done fi " --tag-name-filter cat -- --branches --tags
补充说明
- 如果两个旧邮箱需要替换为不同的新邮箱,可以改成键值对形式处理:
然后在循环中根据旧邮箱匹配对应的新邮箱即可。declare -A EMAIL_MAP=( ['jiangyg@akulaku.com']='new-email1@example.com' ['candra@bankneo.co.id']='new-email2@example.com' ) - 执行前务必备份仓库:
git clone --mirror <原仓库地址> backup-repo,避免数据丢失。 - 修改完成后强制推送到远程:
git push --force --all(此操作会覆盖远程历史,需确保团队成员知情)
内容的提问来源于stack exchange,提问作者jiangxiaopeng
相关产品推荐
相关产品推荐

