O GPG pode assinar confirmações antigas?

93

O Git agora tem a capacidade de assinar confirmações git commit -S, o que é ótimo, mas às vezes eu esqueço a flag e commit, às vezes, envio correções para as quais aplico am, e esse comando não tem uma flag para assinar.

Existe uma maneira de adicionar uma assinatura a uma confirmação já gravada?

Magnus
fonte
2
Para o registro, você pode dizer git para sempre assinar commits via configuração: git config commit.gpgsign true.
Nicooga 23/10
@nicooga Gostaria que seu comentário tivesse mais votos positivos, então notei isso antes. Eu tive que fazer essa pergunta pelo menos meia dúzia de vezes, e definir essa bandeira teria me poupado um monte de tempo.
Michael Ziluck 16/09

Respostas:

78
  1. Entre no modo de rebase interativo.
  2. Adicione a seguinte linha após cada confirmação que você deseja assinar

    exec git commit --amend --no-edit -S

Isso executará este comando depois de escolher cada confirmação.

ATUALIZAR:

A maneira mais fácil de fazer isso é:

git rebase --exec 'git commit --amend --no-edit -n -S' -i development

Isso refaz tudo até o desenvolvimento (ou qualquer hash) e você não precisa copiar e colar após cada confirmação.

Shubham Chaudhary
fonte
Era exatamente o que eu precisava para o que teria sido uma situação realmente tediosa, obrigado!
msouth
2
Oh, eu gostaria de ter encontrado isso antes. Eu li muitas coisas, até do próprio GitHub, dizendo que você não pode renunciar a compromissos antigos. Isso prova que é completamente falso! Eu poderia ter salvo centenas de confirmações, que agora esmaguei. Oh bem ... obrigado por compartilhar! Eu fiz um pseudônimo disso. resign = "!re() { git rebase --exec 'git commit --amend --no-edit -n -S' -i $1; }; re"tornagit resign HASH
BarryMode
2
Isso deve ser de conhecimento comum! Você prestou um grande serviço à humanidade (sem sarc!)!
hopeseekr
3
Não há razão para se recuperar. Apenas corra git commit --amend --no-edit -n -S.
Quolonel Perguntas
9
Isso não muda a história, exigindo um git push --force?
Steve Steve
33

A assinatura de uma confirmação altera seu conteúdo; portanto, confirmações mais recentes, dependendo dela, mudarão seu hash.

Se você apenas deseja assinar a confirmação mais recente, git commit -S --amendfuncionará.

Will Ross
fonte
13

Eu uso git rebase -i --root(consulte Reescrever o histórico ) e mudo pickpara edit.

Então eu uso git commit -S --amend --no-edit && git rebase --continue (no Windows) para cada confirmação.

Este é um sinal manualmente para cada confirmação. Espero que encontremos uma solução melhor.

Iluminador
fonte
Eu tenho meu diretório pessoal como um repositório git (para dotfiles). Alguns programas interativamente percebem as mudanças como rebatizantes, engraçado ver a história sendo reproduzida ao vivo. É lento o suficiente, porque a assinatura é lento
Avindra Goolcharan
2

Eu também tropecei no mesmo problema e aqui está a minha solução:

git rebase -i --root --exec 'git commit --amend --no-edit --no-verify -S'

isso assinará todos os meus commits desde o primeiro commit inicial e também ignorará o gancho de commit que eu configurei usando o husky . Não há necessidade de mudar pickparaedit .

DrSensor
fonte
1

Se você deseja filtrar apenas confirmações específicas e assinar apenas elas, pode usar filter-branch:

git filter-branch --commit-filter 'if [ "$GIT_COMMITTER_EMAIL" = "[email protected]" ];
  then git commit-tree -S "$@";
  else git commit-tree "$@";
  fi' HEAD

Isso é útil se, por algum motivo, você desejar assinar apenas seus próprios commits.

Roberto Leinardi
fonte
0

Se você precisar assinar com GPG todas as confirmações DESDE uma confirmação específica na ramificação atual, use o seguinte:

git filter-branch --commit-filter 'git commit-tree -S "$@";' <COMMIT>..HEAD

Onde <COMMIT>está o ID de confirmação (por exemplo abc123e5).

Isso tem o benefício adicional de não perturbar os metadados de confirmação (incluindo a data de confirmação).

Se você também gostaria de parar de receber a senha de GPG em cada confirmação, veja também esta resposta: https://askubuntu.com/a/805550

NOTA: A mudança de gpgpara gpg2para assinatura GIT exigirá que você reimporte sua chave privada no GPG 2.

GuyPaddock
fonte