git + gpg, conheça seus commits

Mike Gerwitz me assustou pra caralho, então escrevi esta dica para resumir sua história horrível …

Assine seus compromissos

Como você pode ter certeza de que qualquer commit git seu é legítimo? Configure o GPG e assine seus commits.

1) tentativa de assinar um commit (ocorrerá um erro se você nunca fez esse tipo de coisa antes)

$ cd /tmp
$ git init gpg
-experiment
$ cd gpg
-experiment
$ git commit
-S --allow-empty -m "First signed commit."
error
: cannot run gpg: No such file or directory
error
: could not run gpg.
fatal
: failed to write commit object
$

2) corrigir o erro acima usando $ brew install gpg

3) tentativa de assinar um commit (pela segunda vez, isso vai dar erro novamente)

$ git commit -S --allow-empty -m "First signed commit."
gpg
: directory `~/.gnupg' created
gpg: new configuration file `
~/.gnupg/gpg.conf' created
gpg: WARNING: options in `~/.gnupg/gpg.conf'
are not yet active during this run
gpg
: keyring `~/.gnupg/secring.gpg' created
gpg: keyring `
~/.gnupg/pubring.gpg' created
gpg: skipped "My Name <me@myemail.com>": secret key not available

gpg: signing failed: secret key not available

error: gpg failed to sign the data

fatal: failed to write commit object

$

4) corrija o erro acima usando $ gpg --gen-key

Você terá que responder a algumas perguntas, aqui estão elas em ordem:

  • Selecione o tipo de chave que você deseja. Eu fui com o que o gpg recomendou
  • Que tamanho de chave você quer? Eu fui com o que o gpg recomendou
  • Especifique por quanto tempo a chave deve ser válida: Eu escolhi que a minha não expirasse
  • Em seguida, ele pede seu nome real, comentário e endereço de e-mail: Eu não coloquei um comentário.
  • Por fim, é solicitado que você forneça uma senha longa, torne-a correta: Eu coloquei … boa tentativa.

5) assinar um commit com sucesso

Se você usou o mesmo nome real e e-mail ao gerar sua chave gpg que você usa como seu nome / e-mail git, o seguinte deve funcionar:

$ git commit -S --allow-empty -m "First signed commit."
You need a passphrase to unlock the secret key for
...
[master (root-commit) 881116a] First signed commit.
$

Caso contrário, se você usou um nome / e-mail diferente, você precisará primeiro definir sua chave de assinatura com git. Obtenha uma lista de suas chaves com o seguinte:

$ gpg --list-secret-keys | grep ^sec
sec
4096R/8EE30EAB 2011-06-16

Faça a parte em que 8EE30EAB é para mim, mas será diferente para você. Então corra:

$ git config --global user.signingkey 8EE30EAB

Depois de fazer isso, você deverá conseguir assinar um commit

$ git commit -S --allow-empty -m "First signed commit."
You need a passphrase to unlock the secret key for
...
[master (root-commit) 881116a] First signed commit.
$

6) Ver a assinatura no log de commit

$ git log --show-signature

Exporte sua chave pública

Se você deseja compartilhar sua chave pública com um amigo, você precisará exportá-la:

$ gpg --export -a "Your Name" > me.pgp

Importe chaves públicas de pessoas que você conhece

Se você quiser verificar a assinatura do commit de alguém, você pode importar sua chave pública:

$ gpg --import myfriend.pgp

Chave pública do amigo confiável

Se você pode confiar que uma chave pública realmente pertence a um amigo seu, você pode “assiná-la”. Para assiná-lo, você precisa executar o comando edit:

$ gpg --edit "My Friend"
...

Você pode então assinar a chave pública do seu amigo:

gpg> sign
...
Really sign? (y/N) y

Saia do gpg (certifique-se de executar o comando quit)

gpg> quit
Save changes? (y/N) y

Conclusão

Muito mais pode ser feito com o gpg, basta perguntar ao Google .