Git 现在能够使用 签署提交git commit -S,这很棒,但有时我忘记了标志commit,有时我将我申请的补丁邮寄给自己am,并且该命令没有签名标志。
有没有办法为已经记录的提交添加签名?
Shu*_*ary 171
在您要签名的每个提交之后添加以下行
exec git commit --amend --no-edit -S
这将在选择每个提交后运行此命令。
更简单的方法是:
git rebase --exec 'git commit --amend --no-edit -n -S' -i development
Run Code Online (Sandbox Code Playgroud)
这会在开发(或任何哈希)之前重新设置所有内容,并且您不必在每次提交后复制粘贴。
小智 52
签署一个提交会改变它的内容,所以最近的提交会改变它们的哈希值。
如果您只想签署最近的提交,git commit -S --amend将起作用。
小智 14
如果您需要 GPG 签署自当前分支上的特定提交以来的所有提交,您可以使用以下代码:
git filter-branch --commit-filter 'git commit-tree -S "$@";' <COMMIT>..HEAD
Run Code Online (Sandbox Code Playgroud)
<COMMIT>提交 ID在哪里(例如abc123e5)。
这有一个额外的好处,它不会干扰提交元数据(包括提交日期)。但是,提交哈希会改变(因为它是每个提交内容的摘要,并且每个提交都会添加一个签名)。
如果您还想停止在每次提交时提示您输入 GPG 密码,请参阅此答案:https : //askubuntu.com/a/805550
注意:从 切换gpg到gpg2GIT 签名将需要您在 GPG 2 中重新导入您的私钥。
小智 9
我也偶然发现了同样的问题,这是我的解决方案:
git rebase -i --root --exec 'git commit --amend --no-edit --no-verify -S'
Run Code Online (Sandbox Code Playgroud)
这将签署我第一次初始提交的所有提交,并绕过我使用husky设置的提交钩子。无需更改pick为edit.
小智 7
如果不需要对提交进行过滤,那么最好使用 rebase 而不是 filter-branch:
git rebase -i master --exec 'git commit --amend --no-edit --no-verify -S --reset-author'
Run Code Online (Sandbox Code Playgroud)
否则,您可以保持不属于您的提交不变。
设置以下别名~/.gitconfig(替换your@address.com为您的电子邮件地址):
resign = "!_() { : git checkout ; [ \"$#\" -eq 0 ] && echo 'Usage: resign <rev-list>' && exit 2; \
git filter-branch --commit-filter ' \
if [ \"$GIT_COMMITTER_EMAIL\" = \"your@address.com\" ]; then git commit-tree -S \"$@\"; else git commit-tree \"$@\"; fi' $1; }; _"
Run Code Online (Sandbox Code Playgroud)
例如,要放弃从 master 拉取的当前分支中的所有提交,请执行以下操作:
git resign master..
Run Code Online (Sandbox Code Playgroud)
归功于 BarryMode和 Roberto Leinardi之前的回答
如果您只想过滤特定的提交并仅对它们进行签名,您可以使用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
Run Code Online (Sandbox Code Playgroud)
如果出于某种原因,您只想签署自己的提交,这将非常有用。