Existe uma maneira fácil de fazer o Git sempre assinar cada commit ou tag que é criado?
Eu tentei com algo como:
alias commit = commit -S
Mas isso não deu certo.
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 crio, pois envio commits únicos para um projeto como o Homebrew, etc.
git
public-key-encryption
gnupg
MindTooth
fonte
fonte
git filter-branch -f --commit-filter 'git commit-tree -S "$@"' HEAD@{u}..HEAD
(não quero dizer que você deva usar isso).Respostas:
Nota: se você não deseja adicionar
-S
o tempo todo para garantir que seus commits sejam assinados, existe uma proposta (filial 'pu
', por enquanto, dezembro de 2013, portanto, não há garantia de que seja uma versão git) para adicionar um config 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 patches )
Veja commit 2af2ef3 de Nicolas Vigier (boklm) :
Adicione a
commit.gpgsign
opção para assinar todas as confirmaçõesEssa configuração geralmente é definida por repo (você não precisa assinar seus repositórios locais experimentais particulares):
Você combinaria isso com
user.signingKey
usado como uma configuração global (chave exclusiva usada para todos os repositórios em que você deseja assinar o commit)user.signingKey
foi introduzido no git 1.5.0 (janeiro de 2007) com o commit d67778e :Isso é reforçado com comprometer aba9119 (git 1.5.3.2), a fim de pegar o caso Se o usuário tiver configurado incorretamente
user.signingKey
em sua.git/config
ou simplesmente não tem nenhum chaves secretas em seu chaveiro.Notas:
signingKey
, nãosigningkey
, embora asgit config
teclas são caso insensível. Isso importa somente se você fazgit config --get-regexp
, que é sensível a maiúsculas, caso contrário, é apenas uma convenção legibilidade;git push --signed
falhou ao considerar ouser.signingKey
valor de configuração;user.signingKey
para forçar a assinatura de tags anotadas e também confirma: commit 61c2fe0 .fonte
Substitua 9E08524833CB3038FDE385C54C0AFCCFED5CDE14 pelo seu ID da chave. Lembre-se: nunca é uma boa ideia usar o código curto .
ATUALIZAÇÃO: Por um novo edital do git , todas as chaves de configuração devem estar no camelCase.
fonte
~/.gnupg/gpg-agent.conf
e adicionarpinentry-program /usr/bin/pinentry-gtk-2
(seguindo este guia wiki.archlinux.org/ index.php / GnuPG # pinentry )Edit: A partir do Git versão 1.7.9, que é possível assinar commits Git (
git commit -S
). Atualizando a resposta um pouco para refletir isso.O título da pergunta é:
Resposta curta: sim, mas não faça isso.
Resolver o erro de digitação na pergunta:
git commit -s
não assina a confirmação. Pelo contrário, naman git-commit
página:Isso fornece uma saída de log semelhante à seguinte:
Observe o bit "assinado por: ..."; que foi gerado pela
-s
bandeira nogit-commit
.Citando o e - mail do anúncio de lançamento :
Então, sim, você pode assinar confirmações. No entanto, peço cautela com esta opção; assinar automaticamente confirmações é quase inútil, veja abaixo:
Está correto. As confirmações não são assinadas; tags são. A razão para isso pode ser encontrada nesta mensagem por Linus Torvalds , cujo último parágrafo diz:
Eu incentivaria uma navegação na mensagem vinculada, que esclarece por que a assinatura confirmada automaticamente não é uma boa idéia de uma maneira muito melhor do que eu poderia.
No entanto , se você quiser assinar automaticamente uma tag , poderá fazê-lo colocando o
git-tag -[s|u]
alias em um alias; se você fizer isso, provavelmente desejará configurar seu ID de chave~/.gitconfig
ou o.git/config
arquivo específico do projeto . Mais informações sobre esse processo podem ser vistas no livro da comunidade git . A assinatura de tags é infinitamente mais útil do que a assinatura de cada confirmação que você faz.fonte
git blame
para quem ele quiser.Para fazer a assinatura automática funcionar antes da versão 2.0 do git, você precisará adicionar o alias do git para confirmação.
fonte
Você precisa deixar claro que, se você assinar um commit ou tag, isso não significa que você aprova todo o histórico. No caso de commits, você assina apenas a alteração em mãos e, no caso de tag, bem ... você precisa definir o que quer dizer com isso. Você pode ter efetuado uma alteração que afirma ser sua, mas não foi (porque alguém a colocou no controle remoto). Ou é uma alteração na qual você não deseja participar, mas acabou de assinar a tag.
Em projetos OSS típicos, isso pode ser menos comum, mas em um cenário corporativo em que você apenas toca o código de vez em quando e não lê todo o histórico, isso pode passar despercebido.
Assinar confirmações é um problema se elas forem rebatizadas ou escolhidas a dedo para outros pais. Mas seria bom se um commit modificado pudesse apontar para o commit "original" que realmente verifica.
fonte
commit.gpgsign
como true, conforme sugerido por @VonC