5

最新版本的 git (>= 1.7.9) 支持使用 GPG 对单个提交进行签名。

是否可以追溯签署树中的所有提交?

4

3 回答 3

4

来自(aka ) 选项git commit的签名是用于生成标识提交的 sha1 哈希的数据的一部分。因此,追溯签署提交将需要更改已完成的每个提交的 ID。--gpg-sign-S

如果你真的想要,你可能会用 做一些事情git filter-branch,但最好只签署新的提交。由于所有祖先的提交 ID 将影响将由任何新提交签名的数据,这仍然允许 gpg 通过新的签名提交来验证旧提交。

于 2012-11-22T03:16:46.587 回答
2

追溯签署树中的所有提交?

是:添加一个标签,您将签署
这实际上是签署提交时的首选选项:通过标签签署所有提交,而不是单独签署每个提交。
请参阅“如何在 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 日)

sequencerignore_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正在使用与预告片解析器内部使用的完全相同的函数。

对于所有当前的调用者来说,这似乎都是正确的,但没有任何保证。我们最好首先只将正确的缓冲区提供给预告片代码。

于 2012-11-22T07:13:13.480 回答
1

您可以尝试从要开始签署提交的位置创建一个新分支。我最近为我在没有访问我的私钥的机器上创建的一个分支做了这个:

# git checkout -b new-branch <last-signed-commit>
# git cherry-pick <first-unsigned-commit>
# git checkout unsigned-branch
# git rebase new-branch

这要求您的 Git 配置为自动签署您的提交,并且显然不应该有太多的合并提交,否则 rebase 会看起来很奇怪。如果有疑问,请挑选您的提交;然后将签署每个选择的提交。

于 2015-07-24T18:57:06.943 回答