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

3htmauhk  于 2023-03-16  发布在  Git
关注(0)|答案(4)|浏览(135)

正如标题所说,我正在寻找一种方法来gpg签名我以前在一个仓库中的所有提交(最好不用键入我的密码为每个提交)。
谢谢!

vc9ivgsu

vc9ivgsu1#

我的方法是

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会清楚地显示原始提交的时间和最后一次签名的时间。

w41d8nur

w41d8nur2#

你可以,但它将不得不重写你的整个历史这样做。
签名一个提交会改变该提交,从而改变其提交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来处理这个问题。

hwamh0ep

hwamh0ep3#

如果你只想过滤特定的提交并且只对它们进行签名,你可以使用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

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

n6lpvg4x

n6lpvg4x4#

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

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

可以自动使用其他答案。

相关问题