Existe uma maneira de "autosign" commits no Git com uma chave GPG?




settings github (4)

Edit: A partir do Git versão 1.7.9, é possível assinar commits do Git ( git commit -S ). Atualizando a resposta ligeiramente para refletir isso.

O título da pergunta é:

Existe uma maneira de "autosign" commits no Git com uma chave GPG?

Resposta curta: sim, mas não faça isso.

Endereçando o erro na pergunta: git commit -s não assina o commit. Em vez disso, na página man git-commit :

-s, --signoff
Adicionar Linha assinada pelo committer no final da mensagem de log de confirmação.

Isso fornece uma saída de log semelhante à seguinte:


± $ git log                                                                                 [0:43:31]
commit 155deeaef1896c63519320c7cbaf4691355143f5
Author: User Name 
Date:   Mon Apr 16 00:43:27 2012 +0200

    Added .gitignore

    Signed-off-by: User Name 

Observe o bit "assinado-off-by: ..."; que foi gerado pelo sinalizador -s no git-commit .

Citando o e - mail de anúncio de lançamento :

  • "git commit" aprendeu "-S" para assinar o commit com GPG; isto pode ser mostrado com a opção "--show - signature" para "git log".

Então sim, você pode assinar commits. No entanto, eu pessoalmente peço cautela com essa opção; Assinatura automática de commits é quase inútil, veja abaixo:

Apenas uma questão paralela, talvez os commits não devam ser assinados, apenas tags, que eu nunca criei, pois envio commits únicos.

Está correto. Commits não são assinados; tags são. A razão para isso pode ser encontrada nesta mensagem por Linus Torvalds , o último parágrafo do qual diz:

Assinar cada commit é totalmente estúpido. Significa apenas que você o automatiza e faz com que a assinatura valha menos. Ele também não adiciona nenhum valor real, já que a forma como a cadeia de DAG do git do SHA1 funciona, você só precisa de uma assinatura para fazer com que todos os commits alcançados por ela sejam efetivamente cobertos por ela. Então assinar cada commit é simplesmente perder o ponto.

Eu encorajaria uma navegação da mensagem vinculada, que esclarece por que assinar confirmações automaticamente não é uma boa ideia de uma maneira muito melhor do que eu poderia.

No entanto , se você quiser assinar automaticamente uma tag , poderá fazer isso agrupando a git-tag -[s|u] em um alias. Se você for fazer isso, provavelmente desejará configurar seu id de chave em ~/.gitconfig ou no arquivo .git/config específico do projeto. Mais informações sobre esse processo podem ser vistas no livro da comunidade do git . Assinar tags é infinitamente mais útil do que assinar cada commit que você faz.

Existe uma maneira fácil de fazer o Git sempre assinar cada commit ou tag que é criado?

Eu tentei com algo parecido com:

alias commit = commit -S

Mas isso não funcionou.

Eu não quero instalar um programa diferente para que isso aconteça. É factível com facilidade?

Apenas uma pergunta secundária, talvez os commits não devam ser assinados, apenas tags, que eu nunca criei, já que envio commits únicos para um projeto como o Homebrew, etc.


Nota: se você não quiser adicionar -S o tempo todo para garantir que seus commits sejam assinados, existe uma proposta (ramificação ' pu ' por enquanto, dezembro de 2013, então não há garantia de que ela será lançada em um release do git) para adicionar uma configuração que cuidará dessa opção para você.
Atualização de maio de 2014: está no Git 2.0 (depois de reenviar nesta série de atualizações )

Veja commit 2af2ef3 de Nicolas Vigier (boklm) :

Adicione a opção commit.gpgsign para assinar todos os commits

Se você quiser assinar todos os seus commits, você deve adicionar a opção -S o tempo todo.
A opção de configuração commit.gpgsign permite assinar todos os commits automaticamente.

commit.gpgsign

Um booleano para especificar se todas as confirmações devem ser assinadas com GPG.
O uso desta opção ao fazer operações como rebase pode resultar em um grande número de commits sendo assinados. Pode ser conveniente usar um agente para evitar digitar sua senha GPG várias vezes.

Essa configuração geralmente é definida por repo (você não precisa assinar seus repositórios locais privados experimentais):

cd /path/to/repo/needing/gpg/signature
git config commit.gpgsign true

Você combinaria isso com user.signingKey usado como uma configuração global (chave exclusiva usada para todos os repositórios nos quais você deseja assinar commit)

git config --global user.signingkey F2C7AB29

user.signingKey foi introduzido no git 1.5.0 (jan. 2007) com commit d67778e :

Não deve haver uma exigência de que eu use a mesma forma do meu nome no meu repositório git e na minha chave gpg.
Além disso, eu posso ter várias chaves no meu chaveiro e talvez queira usar uma que não corresponda ao endereço que eu uso em mensagens de confirmação.

Este patch adiciona uma entrada de configuração " user.signingKey " que, se presente, será passada para a opção "-u" para gpg, permitindo que a chave de assinatura de marca seja substituída.

Isto é forçado com commit aba9119 (git 1.5.3.2) para capturar o caso em que Se o usuário configurou incorretamente user.signingKey em seu .git/config ou simplesmente não possui nenhuma chave secreta em seu chaveiro.

Notas:

  • Por convenção, desde o git 2.4.0 de março de 2015 , ele é signingKey , não signingkey , mesmo que as chaves de git config do git config sejam sensíveis a maiúsculas e minúsculas. Isso importaria apenas se você fizer o git config --get-regexp , que faz git config --get-regexp maiúsculas e minúsculas, caso contrário, é apenas uma convenção de legibilidade;
  • Se você quiser que o servidor git verifique a assinatura de cada push , você precisará do git 2.2+ (outubro 2014) pelo menos ( commit b945901 ), já que o git push --signed falhou ao considerar o valor de configuração user.signingKey ;
  • O git 2.9 (junho de 2016) usará user.signingKey para forçar a assinatura de tags anotadas, assim como o commit: commit 61c2fe0 .

Você precisa deixar claro que, se assinar um commit ou tag, não significa que aprova todo o histórico. No caso de commits você só assina a mudança em mãos, e no caso de tag, bem .. você precisa definir o que você quer dizer com isso. Você pode ter puxado uma mudança que diz que é de você, mas não foi (porque alguém a empurrou para o controle remoto). Ou é uma mudança em que você não quer estar, mas acabou de assinar a tag.

Em projetos típicos de OSS, isso pode ser menos comum, mas em um cenário corporativo em que você toca apenas no código de vez em quando e não lê todo o histórico, ele pode passar despercebido.

Assinar commits é um problema se eles forem rebaixados ou selecionados para outros pais. Mas seria bom se um commit modificado pudesse apontar para o commit "original" que realmente verifica.


git config --global user.signingKey 9E08524833CB3038FDE385C54C0AFCCFED5CDE14
git config --global commit.gpgSign true

Substitua 9E08524833CB3038FDE385C54C0AFCCFED5CDE14 pelo seu ID de chave. Lembre-se: nunca é uma boa ideia usar o ID curto .

ATUALIZAÇÃO: Por um novo edital , todas as chaves de configuração devem estar no camelCase.





gnupg