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

修改Git历史时如何保留后续提交的GPG签名时间戳?

解决Git历史清理后保留原GPG签名时间戳的问题

问题根源

你之前修改系统时间的方法,会导致git rebase --continue重放后续提交时,Git和GPG都使用你修改后的旧系统时间生成提交信息和签名,因此后续所有提交的签名时间戳都会被覆盖成同一个旧时间。

可行方案一:改进Rebase流程(无需修改系统时间)

通过环境变量和GPG参数精准控制单条提交的时间与签名时间,避免影响后续提交:

  1. 启动交互式Rebase,定位到待修改提交的前一个提交:
git rebase -i <目标提交的父提交哈希>
  1. 在编辑界面将目标提交的操作改为edit,保存退出。
  2. 清除敏感数据后,提取原提交的时间戳(替换<原提交哈希>为目标提交的原始哈希):
OLD_TIMESTAMP=$(git show --format=%at <原提交哈希>)
  1. 修改提交并签名,同时指定原时间戳:
GIT_AUTHOR_DATE="@$OLD_TIMESTAMP" \
GIT_COMMITTER_DATE="@$OLD_TIMESTAMP" \
git commit --amend --no-edit -S \
    --date="@$OLD_TIMESTAMP" \
    --gpg-option="--fakedate=@$OLD_TIMESTAMP"
  1. 继续Rebase:
git rebase --continue

此时后续提交会保留自身原始的签名时间戳(Rebase重放时,若需对后续提交重新签名,可重复上述步骤,或用批量处理方法)。

可行方案二:批量处理(适合多提交清理+签名)

若需要清理多个提交的敏感数据,同时批量保留所有提交的原签名时间戳,推荐使用git filter-repo(替代已废弃的git filter-branch):

  1. 备份仓库(重要!避免数据丢失):
cp -r 你的仓库目录 你的仓库目录_备份
  1. 清除敏感数据:
    • 替换文件中的敏感内容(比如替换密码为REDACTED):
    git filter-repo --replace-text <(echo '原始敏感内容==>替换后的内容')
    
    • 删除包含敏感数据的文件:
    git filter-repo --path 敏感文件名.txt --invert-paths
    
  2. 批量重新签名所有提交并保留原时间戳:
git rebase --root -i --exec '
    OLD_TIMESTAMP=$(git show --format=%at HEAD)
    GIT_AUTHOR_DATE="@$OLD_TIMESTAMP" \
    GIT_COMMITTER_DATE="@$OLD_TIMESTAMP" \
    git commit --amend --no-edit -S \
        --date="@$OLD_TIMESTAMP" \
        --gpg-option="--fakedate=@$OLD_TIMESTAMP"
'
  1. 强制推送到GitHub(注意:此操作会覆盖远程仓库历史,确认团队成员知晓):
git push --force origin 你的分支名

关键说明

  • --fakedate=@$OLD_TIMESTAMP是让GPG使用原提交时间生成签名,而非当前系统时间。
  • GIT_AUTHOR_DATE和GIT_COMMITTER_DATE用于固定提交的作者时间和提交者时间与原提交一致。
  • 确保你的GPG密钥本地可用,执行gpg --list-secret-keys可验证。

内容的提问来源于stack exchange,提问作者Ape

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 14:33:23