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-commit
和git verify-tag
可以分别用来validation提交和标签。
注意:到git 2.5, git verify-commit
和git 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 gitster
( gitster
) 。
(由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
:对于每个签名,只有
GOODSIG
,BADSIG
,EXPSIG
,EXPKEYSIG
,REVKEYSIG
或ERRSIG
将被发射。
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更糟。