102 votes

Git signe les commits précédents ?

Je me demandais comment signer( -s ) des commits précédents que j'ai faits dans le passé dans git ?

CLARIFICATION : Git a confusément des concepts aux noms similaires git commit -s, --signoff (minuscule -s) et git commit -S, --gpg-sign (majuscule -S).
Cette question porte sur le signoff (minuscule -s).
Cependant, certaines réponses concernent gpg-sign (majuscule -S), qui est mieux traité dans les questions dédiées sur superUser. Pouvez-vous signer les anciens commits avec GPG ? et stackoverflow Existe-t-il un moyen de signer gpg tous les commits précédents ?

136voto

fgiraldeau Points 1655

Pour signer le commit précédent, utilisez l'option amend :

git commit --amend --signoff

Edit : l'amendement ne signe que le dernier commit. Pour signer plusieurs commits, filter-branch y interpret-trailers comme suggéré par vonc et autres devraient être utilisés. Voici ce qui a fonctionné pour moi.

Tout d'abord, configurez git pour remplacer le jeton sign por Signed-off-by . Ceci ne doit être fait qu'une seule fois et est nécessaire à l'étape suivante.

git config trailer.sign.key "Signed-off-by"

La commande git filter-branch avec l'interrupteur --msg-filter évaluera le filtre une fois pour chaque livraison. Le filtre peut être n'importe quelle commande shell qui reçoit le message de livraison sur stdin et le sort sur stdout. Vous pouvez écrire votre propre filtre, ou utiliser git interpret-trailers qui est indépendant. Voici un exemple qui signera les deux derniers commits de la branche actuelle en utilisant l'utilisateur et l'email actuels :

export SIGNOFF="sign: $(git config --get user.name) <$(git config --get user.email)>"
git filter-branch -f --msg-filter \
    "git interpret-trailers --trailer \"$SIGNOFF\"" \
     HEAD~2..HEAD

Note 1) La modification des messages de commit change l'identifiant de commit, ce qui signifie que la poussée sur des branches déjà publiées devra être forcée soit avec --force ou mieux --force-with-lease .

Note 2) si vous avez l'intention d'écrire votre script personnalisé, faites attention que git filter-branch change le répertoire courant en <repo>/.git-rewrite/t . L'utilisation d'un chemin relatif vers le script ne fonctionnera généralement pas. Au lieu de cela, le script doit se trouver dans votre fichier $PATH ou fourni sous la forme d'un chemin absolu.

38voto

sschuberth Points 3073

Ces jours-ci (à partir de Git 2.13 ), vous pouvez généralement faire quelque chose comme

git rebase --signoff HEAD~2

à ajouter Signed-off-by les pieds de page des deux derniers commits (dans cet exemple).

Si votre plage comprend le commit Root, ajoutez le champ --root option pour rebase .

33voto

Sebastian Mancke Points 339

NOTE : la réponse concerne gpg-sign (majuscule -S), qui est mieux traité dans les questions dédiées sur superUser. Pouvez-vous signer les anciens commits avec GPG ? et stackoverflow Existe-t-il un moyen de signer gpg tous les commits précédents ?

Essayez celui-ci pour refaire les anciens commits avec un -S :

git filter-branch -f --commit-filter 'git commit-tree -S "$@"' HEAD

Après cela, vous devez git push -f . Mais attention, les identifiants de commit vont changer et d'autres personnes seront désynchronisées.

26voto

Keshan Nageswaran Points 4909

Si quelqu'un cherche encore une meilleure façon automatisée de signer les engagements.

Essayez ça :

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

Cela va tout rebaser jusqu'au commit-hash (X commits).

Puis git push -f est nécessaire pour repousser le changement dans l'histoire à distance.

14voto

Varun Garg Points 1103

Pour moi, je n'ai fait que modifier signof, sans vérifier mes commits sur github.

La solution qui a fonctionné pour moi est de revenir en arrière, et de signer chaque commit avec -S

git commit --amend -S

Aussi, si vous vérifiez si votre commit est effectivement signé, et que votre email/nom n'est simplement pas ajouté, utilisez cette commande

git show HEAD --show-signature

Un conseil supplémentaire : Si vous modifiez déjà vos commits, il se peut que vous vouliez que votre vrai nom y figure (voir l'utilisation de git log ). Il se peut que vous utilisiez votre nom d'utilisateur Github, ce qui n'est pas nécessaire. Seul l'email correct est nécessaire et dans le champ du nom d'utilisateur vous devez utiliser votre nom complet et github le suivra correctement avec votre nom d'identifiant github. Donc pour corriger votre nom d'utilisateur et signer le dernier commit, utilisez :

git commit --amend --author="FULL NAME <email>" -S

et aussi définir le nom complet pour le nom d'utilisateur dans le futur par

git config --global user.name "FULL NAME"

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X