最新版本的 git (>= 1.7.9) 支持使用 GPG 对单个提交进行签名。
是否可以追溯签署树中的所有提交?
来自(aka ) 选项git commit
的签名是用于生成标识提交的 sha1 哈希的数据的一部分。因此,追溯签署提交将需要更改已完成的每个提交的 ID。--gpg-sign
-S
如果你真的想要,你可能会用 做一些事情git filter-branch
,但最好只签署新的提交。由于所有祖先的提交 ID 将影响将由任何新提交签名的数据,这仍然允许 gpg 通过新的签名提交来验证旧提交。
追溯签署树中的所有提交?
是:添加一个标签,您将签署。
这实际上是签署提交时的首选选项:通过标签签署所有提交,而不是单独签署每个提交。
请参阅“如何在 post-receive hooks 中获取 pusher 的信息? ”。
请注意(2017 年 5 月更新)只有 Git 2.13.x/2.14(2017 年第三季度)将完全修复签名过程,因为“ git cherry-pick
”和其他使用定序器机器并错误处理了最后一行是不完整行的拖车块。
已修复此问题,以便在完成现有的不完整行后添加额外的签核等。
请参阅Jonathan Tan ( )的提交 44dc738(2017 年 4 月 26 日) 。(由Junio C Hamano 合并 -- --在提交 6ebfa10中,2017 年 5 月 16 日)jhowtan
gitster
sequencer
: 在添加页脚之前添加换行符
当遇到不以换行符结尾的提交消息时,sequencer 在确定是否应添加空行之前不会完成该行。
这会导致“(cherry picked...
”和签核行有时与提交消息的最后一行出现在同一行。此行为由提交 967dfd4(“序列器:使用预告片的预告片布局”,2016-11-29)引入。但是,恢复该提交并不能完全解决此问题:在该提交之前,
has_conforming_footer()
如果没有终止换行符,则符合标准的页脚被视为不符合标准,导致符合标准和不符合标准的页脚被视为相同当他们不应该的时候。解决此问题,适用于符合要求的页脚和不符合要求的页脚,以及在
do_pick_commit()
and中append_signoff()
,如果在检查页脚的一致性之前,如果提交消息不以一个结尾,则始终在提交消息中添加换行符。
使用 Git 2.29(2020 年第四季度),这将更加可靠。
请参阅提交 842385b、提交 9dad073、提交 26e28fe、提交 75d3bee、提交 20f4b04、提交 5b9427e、提交 8d2aa8d、提交 424e28f、提交 e885a84、提交 185e865(2020 年 9 月 30 日),作者是Jeff King(peff
)。
(由Junio C Hamano 合并 -- gitster
--在提交 19dd352中,2020 年 10 月 5 日)
sequencer
ignore_footer
:解析预告片时的句柄签字人:杰夫·金
该
append_signoff()
函数接受一个"ignore_footer"
参数,该参数指定消息缓冲区末尾不应考虑的字节数(它们不能包含预告片,并且预告片被拼接在它们之前)。但是要找到现有的预告片,它会调用
has_conforming_trailer()
. 该函数需要一个ignore_footer
参数,但由于967dfd4d56 ("sequencer
: use trail's trail layout", 2016-11-02, Git v2.12.0-rc0 -- merge列在批次 #2中),该参数被完全忽略。我们使用的预告片接口采用单个字符串,没有选项告诉它使用字符串的一部分。但是,由于我们有一个 mutable
strbuf
,我们可以通过简单地用 覆盖(然后恢复)边界来解决这个问题NUL
。我不确定这是否真的会在实践中触发错误。通过执行以下操作很容易获得非零值
ignore_footer
:git commit -F - --cleanup=verbatim <<-EOF subject body Signed-off-by: me # this looks like a comment, but is actually in the # message! That makes the earlier s-o-b fake. EOF git commit --amend -s
有 git-commit 调用
ignore_non_trailer()
来计算“#” cruft,它成为ignore_footer
标题。但即使没有这个补丁它也能工作!那是因为预告片代码也调用ignore_non_trailer()
并跳过了代码。所以它恰好起作用,因为唯一具有非零的调用者ignore_footer
正在使用与预告片解析器内部使用的完全相同的函数。对于所有当前的调用者来说,这似乎都是正确的,但没有任何保证。我们最好首先只将正确的缓冲区提供给预告片代码。
您可以尝试从要开始签署提交的位置创建一个新分支。我最近为我在没有访问我的私钥的机器上创建的一个分支做了这个:
# git checkout -b new-branch <last-signed-commit>
# git cherry-pick <first-unsigned-commit>
# git checkout unsigned-branch
# git rebase new-branch
这要求您的 Git 配置为自动签署您的提交,并且显然不应该有太多的合并提交,否则 rebase 会看起来很奇怪。如果有疑问,请挑选您的提交;然后将签署每个选择的提交。