Quais são as vantagens e desvantagens de assinar criptograficamente commits e tags no Git?

99

Então alguém revisou meu trabalho, e ele me disse que eu deveria sempre assinar meus commits e tags criptograficamente. Quando perguntado por que, ele não sabia explicar isso para mim, e disse: "É uma coisa boa a fazer".

Tentando evitar um cenário de chimpanzés óbvio , por que devo realmente? Existem realmente tantas vantagens distintas e sem desvantagens?

Quais são as razões práticas que me obrigam a assinar todos os commits e tags que eu faço?

    
por Madara Uchiha 22.09.2013 / 11:20
fonte

1 resposta

93

(Isso é amplamente baseado em Uma História de Terror do Git: Integridade do Repositório com Compromissos Assinados - muito boa leitura e mais informações do que eu poderia colocar em uma resposta.)

Existem várias maneiras em que um repositório git pode ser comprometido (isto não é uma falha de segurança, apenas um fato da vida - não se deve evitar o uso do git por causa disso). Por exemplo, alguém pode ter enviado para o seu repositório, alegando ser você. Ou, para falar a verdade, alguém poderia ter empurrado para o repositório de alguém else , alegando ser você (alguém poderia empurrar para o próprio repositório, alegando ser você também). Isso é apenas parte da vida em um DVCS.

Apenas como exemplo:

$ git config --global user.name 'Madara Uchiha'
$ git config --global user.email [email protected]

Lá, mudei minha configuração do git para fingir que sou você. E agora eu posso me comprometer e deixar esses commits de alguma maneira entrarem na produção, e parece que você fez isso.

Com a assinatura dos commits (e tags), pode-se provar que certos commits e tags eram de você (e coisas que não são assinadas não deveriam ter sido incluídas na compilação de produção). Essa é realmente a chave para tudo isso - assinando commits, você disse que é o seu trabalho.

O aspecto "seu trabalho" é particularmente importante no kernel do linux (e, portanto, no git) que ocasionalmente é afetado por ações judiciais de direitos autorais. Ao assinar commits, você diz que tem direito ao software - ele acompanha a origem. Pode ser que você não tenha acesso à fonte que está sendo reivindicada como autor e a reivindicação é infundada. Pode ser que a empresa tenha esquecido que você estava trabalhando para eles há alguns anos e sob sua direção adicionaram material ao kernel, ou o que quer que seja.

Existe algum debate sobre se cada commit deve ser assinado. De assinatura de GPG para git commit? (de volta em '09 ), Linus escreveu:

Signing each commit is totally stupid. It just means that you automate it, and you make the signature worth less. It also doesn't add any real value, since the way the git DAG-chain of SHA1's work, you only ever need one signature to make all the commits reachable from that one be effectively covered by that one. So signing each commit is simply missing the point.

Muito mais sobre os pensamentos sobre como assinar o git pode ser lido lá também.

Dito isso, ele entrou no caminho de qualquer maneira.

Parece haver um consenso majoritário de que assinar commits é desnecessário, mas assinar tags é muito bom. Essa postagem no blog, na parte superior, sugere que se deve assinar tudo de qualquer maneira. Como eu disse, há algum debate sobre se todo commit é necessário ou não.

A chave para o debate "assinar cada compromisso" provavelmente tem a ver com o fluxo de trabalho que você usa. A maioria das pessoas faz um monte de commits em seu repositório local e, em seguida, empurra esse conjunto. Deve ser suficiente para marcar a coleção final (supondo, isto é, você se certificar de que todas as alterações estão corretas). Se você estiver trabalhando em um ambiente onde muitos commits únicos estão se movimentando, a distinção entre um tag e um commit se torna menos… distinta - e os commits de assinatura podem se tornar mais úteis.

    
por 22.09.2013 / 20:34
fonte