Com as versões mais novas git
, é possível assinar commits individuais (além de tags) com uma chave PGP:
git commit -m "some message" -S
E você pode mostrar essas assinaturas na saída do git log
com a --show-signature
opção:
$ 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 <[email protected]>"
Author: Lars Kellogg-Stedman <[email protected]>
Date: Fri Jun 28 14:28:41 2013 -0400
this is a test
Mas existe uma maneira de verificar programaticamente a assinatura em um determinado commit, além de fazer um grep na saída de git log
? Estou procurando o commit equivalente a git tag -v
- algo que fornecerá um código de saída indicando se havia ou não uma assinatura válida em um determinado commit.
git commit ...
egit log ...
. Pelo que eu sei,gpg
não adicionou subcomandos que sejam passados de formagit
transparente ... Não tenho nenhum repositório para testar, masgit show --show-signature <commitish>
funciona?show_signature
apenas adiciona coisas à saída (consulte github.com/git/git/blob/master/log-tree.c#L370 ).--raw
paragit verify-tag
/git verify-commit
. Veja minha resposta abaixogit log
códigos de status introduz adicionaisE
,X
,Y
,R
paraERRSIG
,EXPSIG
,EXPKEYSIG
eREVKEYSIG
, de modo que um usuário de%G?
fica mais informações. Veja minha resposta editada abaixogpg.minTrustLevel
pode ajudar ao usargit verify-tag
/verify -commit
. Veja minha resposta editada abaixo .Respostas:
Apenas no caso de alguém chegar a esta página através de um mecanismo de busca, como eu: Novas ferramentas foram disponibilizadas nos dois anos desde que a pergunta foi postada: Agora existem comandos git para esta tarefa:
git verify-commit
egit verify-tag
podem ser usados para verificar commits e tags, respectivamente.fonte
Nota: até git 2.5,
git verify-commit
egit verify-tag
exibia apenas uma mensagem legível por humanos.Se você quiser automatizar a verificação, git 2.6+ (Q3 2015) adiciona outra saída.
Consulte commit e18443e , commit aeff29d , commit ca194d5 , commit 434060e , commit 8e98e5f , commit a4cc18f , commit d66aeff (21 de junho de 2015) por brian m. Carlson (
bk2204
) .(Fundido por Junio C Hamano -
gitster
- no commit ba12cb2 , 03 de agosto de 2015)Mais:
git 2.9 (junho de 2016) atualize o documento git merge :
Veja o commit 05a5869 (13 de maio de 2016) de Keller Fuchs (``) .
Auxiliado por: Junio C Hamano (
gitster
) .(Fundido por Junio C Hamano -
gitster
- no commit be6ec17 , 17 de maio de 2016)Atualizar Git 2.10 (terceiro trimestre de 2016)
Consulte commit b624a3e (16 de agosto de 2016) por Linus Torvalds (
torvalds
) .(Fundido por Junio C Hamano -
gitster
- no commit 83d9eb0 , 19 de agosto de 2016)Git 2.11+ (quarto trimestre de 2016) será ainda mais preciso.
Veja o commit 661a180 (12 de outubro de 2016) de Michael J Gruber (
mjg
) .(Fundido por Junio C Hamano -
gitster
- no commit 56d268b , 26 de outubro de 2016)A
git pretty-format
documentação agora inclui:Git 2.12 (1º trimestre de 2017) "
git tag
" e "git verify-tag
" aprenderam a colocar o status de verificação do GPG em seu--format=<placeholders>
formato de saída " " .Consulte commit 4fea72f , commit 02c5433 , commit ff3c8c8 (17 de janeiro de 2017) por Santiago Torres (
SantiagoTorres
) .Consulte commit 07d347c , commit 2111aa7 , commit 94240b9 (17 de janeiro de 2017) por Lukas Puehringer (``) .
(Incorporado por Junio C Hamano -
gitster
- no commit 237bdd9 , 31 de janeiro de 2017)O Git 2.16 (primeiro trimestre de 2018) permitirá que a verificação da assinatura do commit seja ainda mais automatizada, com o
merge.verifySignatures
variável de configuração.Consulte commit 7f8ca20 , commit ca779e8 (10 de dezembro de 2017) de Hans Jerry Illikainen (``) .
(Incorporado por Junio C Hamano -
gitster
- no commit 0433d53 , 28 de dezembro de 2017)A
git merge
página de manual de configuração agora diz:Git 2.19 (Q3 2018) é ainda mais útil, uma vez que "
git verify-tag
" e "git verify-commit
" foram ensinados a usar o status de saída de "gpg --verify
" subjacente para sinalizar assinatura inválida ou não confiável que encontraram.Observação: com Git 2.19,
gpg.format
isso pode ser definido como "openpgp
" ou "x509
", egpg.<format>.program
é usado para especificar qual programa usar para lidar com o formato) para permitir que x.509 certs com CMS via "gpgsm
" sejam usados em vez deopenpgp
via "gnupg
".Consulte o commit 4e5dc9c (09 de agosto de 2018) de Junio C Hamano (
gitster
) .Auxiliado por: Vojtech Myslivec (
VojtechMyslivec
) , brian m. carlson (bk2204
) e Jeff King (peff
) .(Incorporado por Junio C Hamano -
gitster
- no commit 4d34122 , 20 de agosto de 2018)No lado da confiança, há progresso:
com o Git 2.26 (Q1 2020), a
gpg.minTrustLevel
variável de configuração foi introduzida para informar a vários codepaths de verificação de assinatura o nível mínimo de confiança necessário.Veja o commit 54887b4 (27 de dezembro de 2019) de Hans Jerry Illikainen (
illikainen
) .(Fundido por Junio C Hamano -
gitster
- no commit 11ad30b , 30 de janeiro de 2020)A
git config gpg
página do manual agora inclui:Com o Git 2.26 (Q1 2020) , "
git show
" e outros forneceram um nome de objeto em formato bruto em sua saída de erro, que foi corrigido para apresentá-lo em hexadecimal.Testado com
git -C shallow log --graph --show-signature -n1 plain-shallow
após umgit clone --depth 1 --no-local . shallow
Com o Git 2.27 (Q2 2020), o código para fazer a interface com o GnuPG foi refatorado.
Ver commit 6794898 , commit f1e3df3 (04 Mar 2020) de Hans Jerry Illikainen (
illikainen
) .(Fundido por Junio C Hamano -
gitster
- no commit fa82be9 , 27 de março de 2020)fonte
Uma inspeção superficial do código sugere que esse método direto não existe.
Todos os testes no código-fonte git contam com o
grep
ping da saída degit show
(consulte t / t7510-signed-commit.sh para os testes).Você pode personalizar a saída usando algo parecido
--pretty "%H %G?%"
para torná-la fácil de analisar.Parece que você pode pedir
git merge
para verificar uma assinatura, mas, novamente, seus testes dependemgrep
(consulte t / t7612-merge-verify-signatures.sh ). Parece que uma assinatura inválida fará comgit merge
que saia com uma assinatura incorreta, então você pode potencialmente hackear isso fazendo um teste de mesclagem em algum lugar e descartando essa mesclagem, mas isso parece pior do que apenas chamar grep.fonte