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 ?

12voto

VonC Points 414372

En considérant que les signatures modifient le message de validation, on utilise git filter-branch pour y parvenir.

git filter-branch --msg-filter \
    "cat - && echo && echo 'Signed-off-by: Dan McGee <email@example.com>'" \
    HEAD

(exemple tiré de " git filter-branch magie ")

Ou, suivant Curt J. Sampson 's suggestion en utilisant git interpret-trailers :

git config trailer.sign.key "Signed-off-by"
git filter-branch --msg-filter \
    "cat - && echo && git interpret-trailers --trailer 'sign: 'Signed-off-by: Dan McGee <email@example.com>'" \
    HEAD

avertissement : cela changera le SHA1 de vos commits existants, et vous pourriez avoir à pousser le résultat de force, ce qui peut être problématique si vos commits sont déjà partagés par d'autres.

vorburger ajoute dans le commentaire un exemple :

En utilisant la version 2.20.1 de git, j'ai dû omettre " Signed-off-by " dans --trailer 'sign: et faites comme ceci :

git filter-branch --msg-filter \
  "cat - && echo && git interpret-trailers --trailer 'sign: Michael Vorburger <vorburger@redhat.com>'" \
  HEAD

9voto

roshnet Points 52

Un rebasement interactif avec le -S Le drapeau fera l'affaire.

Disons que vous avez besoin de signer pour le dernier n commet (assurez-vous de vérifier le plus récent de ceux-ci n commits).

Cours :

$ git rebase -S -i HEAD~n

# The `-S` flag is important.
# It tells Git to sign the following commits.

Cela donne une liste des dernières n s'engage.

Maintenant, changez pick a edit préfixe pour tous les engagements que vous voulez signer.

Une fois cela fait, fermez l'éditeur. Un nouvel éditeur s'ouvrira avec tout ce qui concerne le commit.

Puisque rien ne doit être modifié dans le commit, enregistrez le fichier et quittez l'éditeur. Vous pouvez également modifier le message de validation pendant que vous y êtes.

Répétez ceci pour les autres commits.

Pour pousser le dernier historique, git push remote branch -f .

Avertissement

Il y a un hic - il peut réécrire vos commits.

Si vous signez un commit vieux de 4 mois, cela peut écraser sa date et faire croire qu'il a été créé aujourd'hui. Ce n'est donc pas recommandé si vous voulez préserver l'historique de vos livraisons.

6voto

Martin Points 79

J'ai eu un problème similaire. Voici, grâce à Robin Johnson de Gentoo Linux, une astuce pour ajouter la signature à tous mes commits précédents non poussés :

$ git pull && git rebase --gpg-sign --force-rebase origin/master && git push --signed
Already up-to-date.
Current branch master is up to date, rebase forced.
First, rewinding head to replay your work on top of it...
Applying: sci-biology/KING: new package
Applying: dev-lang/yaggo: version bump, fix install procedure
Applying: sci-libs/htslib: version bump
Applying: sci-biology/bcftools: version bump
Applying: sci-biology/samtools: version bump
Applying: sci-biology/libBigWig: new release with io.h renamed to bigWigIO.h
Applying: sci-biology/MaSuRCA: add more URLs to HOMEPAGE
Applying: sci-biology/SPAdes: update comments on bundled dev-libs/boost
Applying: sci-biology/khmer: added a comment how to proceed with src_compile()
Applying: sci-biology/picard: version bump
Applying: sci-biology/ruffus: pint EGIT_REPO_URI to the archive URL of code.google.com
Applying: sci-biology/vcftools: the 0.1.15_pre release was just renamed to 0.1.15 by upstream
Applying: sci-biology/nanopolish: new package
Applying: sci-biology/libBigWig: version bump
Counting objects: 75, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (75/75), done.
Writing objects: 100% (75/75), 14.51 KiB | 0 bytes/s, done.
Total 75 (delta 55), reused 0 (delta 0)
remote: To github.com:gentoo/sci.git
remote:    29c5e3f5d..b37457700  master -> master
To git+ssh://git.gentoo.org/proj/sci.git
   29c5e3f5d..b37457700  master -> master
$

3voto

obotezat Points 31

Une solution de rechange qui ne réécrit pas l'histoire :

  1. créer une nouvelle branche
  2. fusionner à partir de l'ancien avec des drapeaux --no-commit --no-ff
  3. git reset pour supprimer tous les commits ( signé o non signé )
  4. git commit -S -am "commit message"
  5. pousser la nouvelle branche avec un seul SIGNÉ commettre

    git status ... On branch feature/branch_unsigned_commits ... git checkout -b feature/branch_unsigned_commits_take2 git merge --no-commit --no-ff feature/branch_unsigned_commits git reset git commit -S -am "commit message" git push

2voto

YLyu Points 661

Une solution rapide pour signer le dernier nombre X de commits.

git rebase --signoff @~X

Par exemple, signer les 10 derniers commits

git rebase --signoff @~10

J'ai trouvé que c'était une solution facile pour mon cas. Source : https://pmhahn.github.io/git-signoff/

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