validation签署的git提交?

使用较新版本的git ,可以使用PGP密钥来签署单独的提交(除了标签):

 git commit -m "some message" -S 

你可以--show-signature选项在git log的输出中显示这些签名:

 $ git log --show-signature commit 93bd0a7529ef347f8dbca7efde43f7e99ab89515 gpg: Signature made Fri 28 Jun 2013 02:28:41 PM EDT using RSA key ID AC1964A8 gpg: Good signature from "Lars Kellogg-Stedman <lars@seas.harvard.edu>" Author: Lars Kellogg-Stedman <lars@seas.harvard.edu> Date: Fri Jun 28 14:28:41 2013 -0400 this is a test 

但有没有一种方法来编程validation签名在给定的提交,而不是通过刷新git log的输出? 我正在寻找相当于git tag -v的提交 – 这将提供一个退出代码,指示给定提交是否有有效的签名。

以防万一有人通过search引擎来到这个页面,就像我所做的那样:自问题发布两年以来,新的工具已经可用:现在有git命令来执行这个任务: git verify-commitgit verify-tag可以分别用来validation提交和标签。

注意:到git 2.5, git verify-commitgit verify-tag只显示一条人类可读的消息。
如果你想自动检查,git 2.6+(Q3 2015)增加了另一个输出。

请参阅提交e18443e , 提交aeff29d , 提交ca194d5 , 提交434060e , 提交8e98e5f , 提交a4cc18f , 提交d66aeff (2015年6月21日)作者: brian m。 卡尔森( bk2204 ) 。
(由Junio C gitster合并- gitster – in commit ba12cb2 ,2015年8月3日)

verify-tag / verify-commit :添加选项来打印原始的gpg状态信息

verify-tag / verify-commit默认情况下显示标准错误的人类可读输出。
但是,访问原始gpg状态信息也是有用的,这些信息是机器可读的,允许自动执行签名策略

添加一个--raw选项 ,使verify-tag产生的标准错误,而不是人类可读格式的gpg状态信息。

加:

verify-tag成功退出,如果签名是好的,但密钥不可信。 verify-commit退出失败。
这种行为上的分歧是意想不到的。
由于之前存在verify-tag ,因此添加一个失败的testing来verify-commit verify-tag的行为。


git 2.9(2016年6月)更新了git merge doc :

见Keller Fuchs(“)的 提交05a5869 (2016年5月13日) 。
帮助: Junio C gitstergitster ) 。
(由Junio C gitster合并- gitster – 承诺 2016年5月17日17ec17 )

 --verify-signatures: --no-verify-signatures: 

validation被合并的分支的提示提交是否使用有效密钥进行签名,即具有有效uid的密钥:在默认信任模型中,这意味着签名密钥已由可信密钥签名。
如果侧分支的提示提交没有用有效的键签名,合并将被中止


更新Git 2.10(2016年第三季度)

见Linus Torvalds( torvalds )的提交b624a3e (2016年8月16日) 。
(由Junio C gitster合并- gitster – in commit 83d9eb0 ,2016年8月19日)

gpg-interface :validationpgp签名时,更喜欢“long”格式的输出

显示PGP签名validation状态的“ git log --show-signature ”等命令现在显示的是较长的key-id,因为32位key-id是上个世纪的。

Linus的原始版本已经重新发布,适用于维护轨道,以防二进制分发者在过去陷入僵局时想将其带到旧代码库。


Git 2.11+(Q4 2016)甚至会更精确。

参见Michael J Gruber( mjg )的 提交661a180 (2016年10月12日) 。
(由Junio C gitster合并- gitster -在提交56d268b ,2016年10月26日)

在“ %G? ”漂亮格式说明符中显示的GPGvalidation状态不够丰富,无法区分由过期密钥生成的签名,由撤销密钥生成的签名等
新的输出字母已被分配来expression它们

根据gpg2的doc/DETAILS

对于每个签名,只有GOODSIGBADSIGEXPSIGEXPKEYSIGREVKEYSIGERRSIG将被发射。

git pretty-format文档现在包括:

  • ' %G? ': 显示
    • G ”表示一个好的(有效的)签名,
    • B ”表示签名不好,
    • U ”表示有效性未知的好签名,
    • X ”表示已过期的好签名,
    • Y ”表示由过期密钥签名的好签名,
    • R ”表示由撤销钥匙签名,
    • 如果签名不能被检查(例如缺less密钥),则input“E”,没有签名的则input“N”

Git 2.12(2017年第1季度)“ git tag ”和“ git verify-tag学会将GPGvalidation状态置于其“ --format=<placeholders> ”输出格式

参见圣地亚哥托雷斯( SantiagoTorres )的 提交4fea72f , 提交02c5433 , 提交ff3c8c8 (2017年1月17日) 。
参见Lukas Puehringer(“)的 commit 07d347c , commit 2111aa7 , commit 94240b9 (2017年1月17日) 。
(由Junio C gitster合并- gitster -在2017年1月31日的gitster 提交 )

git tag -v添加--format git tag -v静音GPGvalidation的默认输出,而是打印格式化的标签对象。
这样,在GPGvalidation时,调用者可以使用标签对象头中的标记名来交叉检查来自refs / tags的标记名。

对代码的粗略检查表明,没有这种直接的方法。

git源代码中的所有testing都依赖于grep ping git show的输出(请参阅t / t7510-signed-commit.sh以进行testing)。

您可以使用--pretty "%H %G?%"类的东西--pretty "%H %G?%"定义输出,以便于parsing。

看来你可以要求git merge来validation签名,但是它的testing依赖于grep (请参阅t / t7612-merge-verify-signatures.sh )。 它看起来像一个无效的签名将导致git merge退出与一个糟糕的签名,所以你今天可能会通过做一个testing合并到某处,并抛出了合并,但似乎比只调用grep更糟。