【问题标题】:Is there a way to gpg sign all previous commits?有没有办法对所有以前的提交进行 gpg 签名?
【发布时间】:2017-01-26 21:01:03
【问题描述】:

正如标题所说,我正在寻找一种方法来对存储库中的所有以前的提交进行 gpg 签名(最好不要为每次提交输入密码)。

谢谢!

【问题讨论】:

  • 这里是an old superuser post,对这个问题有一些答案。
  • 有没有办法使用filter-branch 或类似的东西自动执行此操作?这些解决方案要求我在交互式 rebase 中搞砸事情。
  • 一次提交依赖于所有之前的提交。因此,如果您签署一个提交,您就隐含地签署了导致该提交的所有历史记录。
  • 我在这里同意@G.Sliepen,但我还要补充一点,在某些情况下,可能有一些理论上的方法可以破坏 SHA-1在不太可能的情况下,允许攻击者替换一些中间历史提交,从而破坏 Merkle 哈希链保证签署后提交隐含地涵盖所有早期提交。换句话说,GPG 签名 每个 提交在理论上今天更安全。实际上,这并不值得担心。

标签: git gnupg


【解决方案1】:

你可以,但它必须重写你的整个历史才能这样做。

对提交进行签名会更改更改其提交 ID 的提交。由于提交 ID 取决于先前的提交 ID,因此必须更改之后的所有提交。无论如何,你都在签名。

如果它是一个没有其他人在处理的个人存储库,那么这不是问题。如果它是与其他合作者的存储库,则将其视为进行重大变基。

您可以使用 git filter-branch 来重做每个提交,并使用 -S 选项。

git filter-branch --commit-filter 'git commit-tree -S "$@";' -- --all

至于不必每次提交都输入密码,您需要将gpg 配置为使用gpg-agent。如果您熟悉ssh-agent,这是一个类似的想法,这是一个小过程,您只需将密码输入一次并将其保存在内存中。你如何做到这一点取决于你的操作系统和设置。在 OS X 上,我让 GPG Tools 处理它。

【讨论】:

  • 感谢您的帮助!
  • 这很好用,谢谢。稍微解释一下filter-branch 命令可能会改进答案——我根本不熟悉commit-treefilter-branch,所以这一切看起来都很神奇。
  • 运行命令时出现此错误:error: gpg failed to sign the data could not write rewritten commit
【解决方案2】:

我的方法是

git rebase --exec 'git commit --amend --no-edit -n -S' -i 8fd7b22

8fd7b22 之后的下一个提交开始的所有提交都将被重新设置,除了签名之外没有任何更改。要更改从第一个提交开始的所有提交,您可以使用 --root(从 Git v1.7.12 开始):

 git rebase --exec 'git commit --amend --no-edit -n -S' -i --root

将更改传播到我使用的遥控器

git push --force

注意,这将更新“gpg made”日期时间,例如,GitHub 会将其视为提交日期。 Git 本身会保留原始日期和新日期,git log --show-signature 可以清楚地显示原始提交的时间和最后一次签名的时​​间。

【讨论】:

  • 虽然这可行,但我想补充一点,这会破坏实际的提交日期。 @dhilt,您也应该考虑在答案中添加它。所以,除了签名之外,不是“没有变化”。
  • @roshnet 我几乎没有研究并更新了答案。如果您还有更多内容,我很乐意深入挖掘。
  • @dhlit 没问题,感谢您更新答案。
  • 如何签署第一个提交?我在第一次之后签署了所有提交,但不知道如何签署初始提交。
  • @sansari 使用--root [<branch>] 语法指定分支,参考git-rebase doc
【解决方案3】:

如果您只想过滤特定的提交并仅对其签名,您可以使用filter-branch

git filter-branch --commit-filter 'if [ "$GIT_COMMITTER_EMAIL" = "user@domain.com" ];
  then git commit-tree -S "$@";
  else git commit-tree "$@";
  fi' HEAD

如果出于某种原因,您只想签署自己的提交,这很有用。

【讨论】:

    【解决方案4】:

    我想要解决的用例是在保留原始提交日期的同时签署我之前的所有提交。

    签署相关的提交

    git rebase -i --root
    git commit --amend -S --no-edit &&  git rebase --continue # for all the relevant commits
    

    返回提交日期作为作者日期并强制推送(不要忘记之前备份)。

    git rebase --committer-date-is-author-date -i --root # return 
    git push origin main -f
    

    可以使用其他答案自动化。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-17
      • 2022-10-22
      • 2015-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-05
      • 2016-10-12
      相关资源
      最近更新 更多