正如标题所说,我正在寻找一种方法来gpg签名我以前在一个仓库中的所有提交(最好不用键入我的密码为每个提交)。谢谢!
vc9ivgsu1#
我的方法是
git rebase --exec "git commit --amend --no-edit -n -S" -i 8fd7b22
所有从8fd7b22之后的下一个提交开始的提交都将被重定基,除了签名之外不做任何更改。要更改所有从第一个提交开始的提交,您可以使用--root(从Git v1.7.12开始):
8fd7b22
--root
git rebase --exec "git commit --amend --no-edit -n -S" -i --root
将更改传播到我使用的遥控器
git push --force
注意,这会更新“gpg made”的日期-时间,例如,GitHub会将其视为提交日期。Git本身会保存原始和新的日期,git log --show-signature会清楚地显示原始提交的时间和最后一次签名的时间。
git log --show-signature
w41d8nur2#
你可以,但它将不得不重写你的整个历史这样做。签名一个提交会改变该提交,从而改变其提交ID。由于提交ID依赖于前一个提交ID,因此之后的所有提交都必须被改变。无论如何,你都要对它们进行签名。如果它是一个没有其他人在工作的个人存储库,那么这不是一个问题,如果它是一个有其他合作者的存储库,那么就把它当作一个主要的重新建库来对待。您可以使用git filter-branch执行此操作,以便使用-S选项重做每个提交。
git filter-branch
-S
git filter-branch --commit-filter 'git commit-tree -S "$@";' -- --all
至于不必在每次提交时输入密码,您需要配置gpg以使用gpg-agent。如果您熟悉ssh-agent,这是一个类似的想法。这是一个很小的过程,你只需给予一次密码,然后将它保存在内存中。具体操作方式取决于你的操作系统和设置。在OS X上,我让GPG Tools来处理这个问题。
gpg
ssh-agent
hwamh0ep3#
如果你只想过滤特定的提交并且只对它们进行签名,你可以使用filter-branch:
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
如果出于某种原因,您只想签署自己的提交,这是非常有用的。
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
可以自动使用其他答案。
4条答案
按热度按时间vc9ivgsu1#
我的方法是
所有从
8fd7b22
之后的下一个提交开始的提交都将被重定基,除了签名之外不做任何更改。要更改所有从第一个提交开始的提交,您可以使用--root
(从Git v1.7.12开始):将更改传播到我使用的遥控器
注意,这会更新“gpg made”的日期-时间,例如,GitHub会将其视为提交日期。Git本身会保存原始和新的日期,
git log --show-signature
会清楚地显示原始提交的时间和最后一次签名的时间。w41d8nur2#
你可以,但它将不得不重写你的整个历史这样做。
签名一个提交会改变该提交,从而改变其提交ID。由于提交ID依赖于前一个提交ID,因此之后的所有提交都必须被改变。无论如何,你都要对它们进行签名。
如果它是一个没有其他人在工作的个人存储库,那么这不是一个问题,如果它是一个有其他合作者的存储库,那么就把它当作一个主要的重新建库来对待。
您可以使用
git filter-branch
执行此操作,以便使用-S
选项重做每个提交。至于不必在每次提交时输入密码,您需要配置
gpg
以使用gpg-agent。如果您熟悉ssh-agent
,这是一个类似的想法。这是一个很小的过程,你只需给予一次密码,然后将它保存在内存中。具体操作方式取决于你的操作系统和设置。在OS X上,我让GPG Tools来处理这个问题。hwamh0ep3#
如果你只想过滤特定的提交并且只对它们进行签名,你可以使用
filter-branch
:如果出于某种原因,您只想签署自己的提交,这是非常有用的。
n6lpvg4x4#
我想要解决的用例是在保留原始提交日期的同时签署所有以前的提交。
签署相关承诺
返回提交日期作为作者日期并强制推送(不要忘记之前备份)。
可以自动使用其他答案。