有没有办法gpg签署所有以前的提交?

时间:2017-01-26 21:01:04

标签: git gnupg

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

谢谢!

4 个答案:

答案 0 :(得分:11)

你可以,但它必须重写你的整个历史记录。

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

如果它是其他人没有工作的个人存储库,那么这不是问题。如果它是与其他协作者的存储库,那么就像对待一个重要的变种一样对待它。

您可以使用git filter-branch重做每个使用@media screen and (min-width: 720px) { body { background-color: skyblue; } } 选项的提交。

-S

至于不必为每次提交输入密码,您需要配置git filter-branch --commit-filter 'git commit-tree -S "$@";' -- --all 以使用gpg-agent。如果您熟悉gpg这是一个类似的想法,那么您只需将密码提供一次并将其保存在内存中即可。如何操作取决于您的操作系统和设置。在OS X上,我让GPG Tools处理它。

答案 1 :(得分:6)

如果您只想过滤特定提交并仅对其进行签名,则可以使用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

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

答案 2 :(得分:1)

我的方法是

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

所有从8fd7b22开始的提交都将重新签名,除了签名外,其他所有更改都不会更改。

答案 3 :(得分:1)

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

签署相关提交

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

可以自动使用其他答案。