Pouvez-vous GPG signer des vieux commits?

93

Git a maintenant la capacité de signer des commits avec git commit -S, ce qui est génial, mais parfois j'oublie l'indicateur commit, et parfois je m'envoie des correctifs avec lesquels je postule am, et cette commande n'a pas d'indicateur de signature.

Est-il possible d'ajouter une signature à un commit déjà enregistré?

Magnus
la source
2
Pour l'enregistrement, vous pouvez dire git toujours signer commits via la configuration: git config commit.gpgsign true.
Nicooga
@nicooga J'aimerais que votre commentaire ait plus de votes positifs, alors je l'ai remarqué plus tôt. J'ai dû poser cette question au moins une demi-douzaine de fois, et placer ce drapeau m'aurait fait gagner beaucoup de temps.
Michael Ziluck le

Réponses:

79
  1. Passez en mode de base interactif.
  2. Ajoutez la ligne suivante après chaque commit que vous voulez signer

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

Cela exécutera cette commande après avoir sélectionné chaque commit.

MISE À JOUR:

Le moyen le plus simple de le faire est:

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

Cela rebase tout jusqu'au développement (ou n'importe quel hachage) et vous n'avez pas à copier coller après chaque commit.

Shubham Chaudhary
la source
C'était exactement ce dont j'avais besoin pour ce qui aurait été une situation vraiment fastidieuse, merci!
msouth
2
Oh, j'aurais aimé trouver ça plus tôt. J'ai lu tellement de choses, même de GitHub elles-mêmes, disant qu'il est impossible de démissionner d'anciens commits. Cela prouve que c'est complètement faux! J'aurais pu économiser des centaines de commits, que j'ai maintenant écrasés. Oh bien ... merci pour le partage! J'ai fait un alias de ça. resign = "!re() { git rebase --exec 'git commit --amend --no-edit -n -S' -i $1; }; re"devientgit resign HASH
BarryMode
2
Cela devrait être de notoriété! Vous avez rendu un grand service à l'humanité (pas de sarc!)!
hopeseekr
3
Il n'y a aucune raison de rebaser du tout. Il suffit de courir git commit --amend --no-edit -n -S.
Questions Quolonel
9
Cela ne change-t-il pas l'histoire, nécessitant un git push --force?
Steve
34

La signature d'un commit modifie son contenu, donc les derniers commits plus récents changeront de hachage.

Si vous voulez juste signer le commit le plus récent, git commit -S --amendcela fonctionnera.

Will Ross
la source
13

J'utilise git rebase -i --root(voir Historique de réécriture ) et passe pickà edit.

Ensuite, j'utilise git commit -S --amend --no-edit && git rebase --continue (sous Windows) pour chaque commet.

C'est signe manuellement pour chaque commits. J'espère que nous trouverons une meilleure solution.

Illuminateur
la source
J'ai mon répertoire personnel en tant que repo git (pour les fichiers dot). Certains programmes captent les changements de manière interactive, ce qui est amusant de voir l’histoire retransmise en direct. C'est assez lent parce que la signature est lente
Avindra Goolcharan le
2

Je suis également tombé sur le même problème et voici ma solution:

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

cela signera tous mes commits de la première validation initiale et contournera également le crochet de validation que j'ai configuré avec husky . Pas besoin de changer pickpouredit .

DrSensor
la source
1

Si vous voulez filtrer uniquement des commits spécifiques et les signer, vous pouvez utiliser filter-branch:

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

Ceci est utile si, pour une raison quelconque, vous souhaitez signer uniquement vos propres commits.

Roberto Leinardi
la source
0

Si vous devez signer par GPG toutes les validations SINCE d'une validation particulière sur la branche en cours, vous pouvez utiliser les éléments suivants à la place:

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

Où se <COMMIT>trouve l'id de commit (par exemple abc123e5).

Cela présente l'avantage supplémentaire de ne pas perturber les métadonnées de validation (y compris la date de validation).

Si vous souhaitez également ne plus être invité à saisir votre phrase secrète GPG à chaque commit, consultez également la réponse suivante: https://askubuntu.com/a/805550

NOTE: Le passage de gpgla gpg2pour la signature de GIT vous demandera de réimporter votre clé privée dans GPG 2.

GuyPaddock
la source