237 votes

Pouvez-vous signer GPG les anciens commits ?

Git a maintenant la possibilité de signer commits avec git commit -S ce qui est très bien, mais parfois j'oublie le drapeau à commit et parfois je m'envoie des correctifs par courrier que j'applique avec am et cette commande n'a pas d'indicateur pour la signature.

Existe-t-il un moyen d'ajouter une signature à un commit déjà enregistré ?

247voto

Shubham Chaudhary Points 2339
  1. Passez en mode interactif rebase.
  2. Ajoutez la ligne suivante après chaque commit que vous voulez signer

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

Cela lancera cette commande après avoir choisi chaque commit.

UPDATE :

Le moyen le plus simple est de le faire :

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.

0 votes

C'est exactement ce dont j'avais besoin pour une situation qui aurait été vraiment fastidieuse, merci !

6 votes

J'aurais aimé trouver cela plus tôt. J'ai lu tellement de choses, même de GitHub eux-mêmes, disant que vous ne pouvez pas résigner 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 sûr... merci pour le partage ! J'en ai fait un alias. resign = "!re() { git rebase --exec 'git commit --amend --no-edit -n -S' -i $1; }; re" devient git resign HASH

2 votes

Cela devrait être connu de tous ! Vous avez rendu un grand service à l'humanité (sans sarcasme !) !

71voto

stevemac Points 991

La signature d'un commit change son contenu, donc les commit plus récents qui en dépendent changeront leur hachage.

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

2 votes

La plupart du temps, la signature du commit le plus récent, ou même la création d'un commit vide signé par-dessus, suffisent à garantir l'authenticité. Les commit de Git sont un arbre de Merkle, de sorte que la modification de tout commit ancêtre nécessite la réécriture de ses descendants, invalidant ainsi la signature.

1 votes

@gronostaj Cela n'est vrai que tant qu'il n'y a pas d'attaque SHA-1 preimage. Ce n'est pas le cas actuellement, cependant git s'éloigne déjà de SHA-1 .

1 votes

J'imagine que beaucoup d'utilisateurs qui viennent ici cherchent à démissionner tous les commits tout en préservant les métadonnées de commits autres que le commits SHA après un git-filter-repo les dépouille.

30voto

Illuminator Points 321

J'utilise git rebase -i --root ( voir Réécrire l'histoire ) et changer pick a edit .

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

Ceci est signé manuellement pour chaque commits. J'espère que nous trouverons une meilleure solution.

0 votes

J'ai mon répertoire personnel comme repo git (pour dotfiles). Certains programmes récupèrent interactivement les changements au fur et à mesure de la refonte, c'est amusant de voir l'historique rejoué en direct. C'est assez lent parce que la signature est lente

0 votes

J'ai essayé et j'ai obtenu une erreur : gpg failed to sign the data fatal : failed to write commit object

22voto

GuyPaddock Points 575

Si vous avez besoin de signer GPG tous les commits SINCE un commits particulier sur la branche actuelle, vous pouvez utiliser ce qui suit à la place :

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

Donde <COMMIT> est l'identifiant commit (ex. abc123e5 ).

Cela présente l'avantage supplémentaire de ne pas perturber les métadonnées commit (notamment la date commit). Les hachages commit changeront, cependant (puisqu'il s'agit d'un condensé du contenu de chaque commit, et qu'une signature est ajoutée à chaque commit).

Si vous souhaitez également ne plus être invité à saisir votre phrase de passe GPG à chaque commit, consultez également cette réponse : https://askubuntu.com/a/805550

REMARQUE : Le passage de gpg a gpg2 pour la signature GIT vous obligera à réimporter votre clé privée dans GPG 2.

1 votes

On peut également ajouter --env-filter 'export GIT_COMMITTER_DATE="$GIT_AUTHOR_DATE"' pour s'assurer que la date de commit n'est pas réinitialisée à la date du jour.

0 votes

L'inconvénient d'utiliser la date de l'auteur comme date du committer est que vous perdrez la date commit sur les commit rebased/cherry-picked/amended.

0 votes

@Arjan il ne modifie déjà pas la date de commit comme indiqué dans la réponse.

12voto

Rakesh Sharma Points 6401

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'

ceci signera tous mes commits à partir du premier commits initial et également contourner le crochet commit. que j'ai mis en place en utilisant husky . Pas besoin pour changer pick a edit .

5 votes

Celle-ci modifie la date de commit. La date de commit est fixée à l'heure actuelle.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X