You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Git历史提交记录修改求助:指定时间后邮箱替换脚本失效

问题与解决方法

需求

  • 修改历史提交中的邮箱:将jiangyg@akulaku.com和candra@bankneo.co.id替换为指定邮箱
  • 仅修改2021-12-22之后的提交记录

原脚本问题

你之前的脚本存在三个核心问题:

  1. 时间戳获取错误:git show -s --format="%ct" $GIT_COMMITTER_DATE中$GIT_COMMITTER_DATE是日期字符串,不是提交哈希,无法用来获取时间戳,应该用当前提交的哈希$GIT_COMMIT。
  2. 语法错误:[ "$GIT_COMMITTER_EMAIL" = "$OLD_EMAIL"]缺少空格,Shell中括号两边必须有空格。
  3. 未处理两个旧邮箱,只针对了单个邮箱。

修正后的脚本

# 预计算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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 01:25:57