Puoi GPG firmare vecchi commit?


93

Git ora ha la possibilità di firmare con commit git commit -S, il che è fantastico, ma a volte dimentico la bandiera commite a volte mi mando patch con cui applico am, e quel comando non ha una bandiera per firmare.

C'è un modo per aggiungere una firma a un commit già registrato?


2
Per la cronaca, si può dire git di firmare sempre i commit tramite la configurazione: git config commit.gpgsign true.
nicooga,

@nicooga Vorrei che il tuo commento avesse più voti, quindi l'ho notato prima. Ho dovuto sollevare questa domanda almeno una mezza dozzina di volte e impostare quella bandiera mi avrebbe risparmiato un sacco di tempo.
Michael Ziluck,

Risposte:


78
  1. Entra in modalità rebase interattiva.
  2. Aggiungi la seguente riga dopo ogni commit che vuoi firmare

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

Questo eseguirà questo comando dopo aver selezionato ogni commit.

AGGIORNARE:

Il modo più semplice per farlo è:

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

Questo ripristina tutto fino allo sviluppo (o qualsiasi hash) e non è necessario copiare incolla dopo ogni commit.


Questo era proprio quello di cui avevo bisogno per quella che sarebbe stata una situazione davvero noiosa, grazie!
msouth,

2
Oh, vorrei averlo trovato prima. Ho letto così tante cose, anche dagli stessi GitHub, dicendo che non puoi dare le dimissioni dai vecchi commit. Ciò dimostra che è completamente falso! Avrei potuto salvare centinaia di commit, che ora ho schiacciato. Oh bene ... grazie per averlo condiviso! Ne ho tratto uno pseudonimo. resign = "!re() { git rebase --exec 'git commit --amend --no-edit -n -S' -i $1; }; re"diventagit resign HASH
BarryMode

2
Questa dovrebbe essere conoscenza comune! Hai fatto un ottimo servizio per l'umanità (niente sarc!)!
hopeseekr,

3
Non c'è motivo di rifare affatto. Corri e basta git commit --amend --no-edit -n -S.
Quolonel Domande

9
Questo non cambia la storia, richiedendo un git push --force?
Steve,

33

La firma di un commit cambia il suo contenuto, quindi i commit più recenti a seconda di esso cambieranno il loro hash.

Se vuoi solo firmare il commit più recente, git commit -S --amendfunzionerà.


13

Uso git rebase -i --root(vedi Riscrittura cronologia ) e cambio picka edit.

Quindi uso git commit -S --amend --no-edit && git rebase --continue (su Windows) per ogni commit.

Questo è manualmente firmare per ogni commit. Spero che troveremo una soluzione migliore.


Ho la mia directory home come repository git (per dotfile). Alcuni programmi raccolgono in modo interattivo le modifiche come la sua rigenerazione, divertente vedere la storia riprodotta dal vivo. È abbastanza lento perché la firma è lenta
Avindra Goolcharan il

2

Mi sono anche imbattuto nello stesso problema ed ecco la mia soluzione:

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

questo firmerà tutti i miei commit dal primo commit iniziale e bypasserà anche il hook di commit che ho impostato usando husky . Non è necessario passare pickaedit .


1

Se vuoi filtrare solo commit specifici e firmarli solo puoi usare filter-branch:

git filter-branch --commit-filter 'if [ "$GIT_COMMITTER_EMAIL" = "user@domain.com" ];
  then git commit-tree -S "$@";
  else git commit-tree "$@";
  fi' HEAD

Questo è utile se, per qualche motivo, vuoi firmare solo i tuoi commit.


0

Se è necessario firmare GPG tutti i commit DA UN particolare commit sul ramo corrente, è possibile utilizzare invece quanto segue:

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

Dov'è <COMMIT>l'ID commit (ad es abc123e5.).

Ciò ha l'ulteriore vantaggio di non disturbare i metadati del commit (inclusa la data del commit).

Se anche tu vuoi smettere di ricevere la passphrase GPG per ogni commit, vedi anche questa risposta: https://askubuntu.com/a/805550

NOTA: il passaggio da gpga gpg2per la firma GIT richiederà di reimportare la chiave privata in GPG 2.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.