Comment éditer un message de tag existant dans git?

Nous avons plusieurs balises annotées dans notre repository git. Les anciennes balises contiennent des messages bidons que nous aimerions mettre à jour pour être dans notre nouveau style.

% git tag -n1 v1.0 message v1.1 message v1.2 message v2.0 Version 2.0 built on 15 October 2011. 

Dans cet exemple, nous aimerions que les messages v1.x ressemblent au message v2.0. Quelqu’un sait comment nous ferions cela?

git tag ^{} -f -m ""

Cela créera une nouvelle étiquette avec le même nom (en remplaçant l’original).

Pour mettre à jour un message complexe, spécifiez simplement l’option de tag annotée avec l’option -a ou l’option de tag signé avec -s :

 git tag   -f -a 

Cela ouvrira un éditeur avec le contenu de votre ancien message de tag .

git tag ^{} -f -a

Ceci est une amélioration par rapport aux réponses d’ Andy et Eric Hu . Leurs réponses créeront un nouvel object tag qui référencera l’ancien object tag, où les deux auront le même nom de tag.

^{} résoudra la balise / référence jusqu’à ce qu’il trouve le premier hachage de validation.

TL; DR

Vous pouvez le faire en supprimant votre tag et en le recréant tout en usurpant la date et l’auteur:

 > git tag -d  > [GIT_COMMITTER_DATE=] \ > [GIT_AUTHOR_NAME=] \ > git tag  [commit] 

Histoire entière:

S’appuyant sur la réponse de Sungram (proposée à l’origine comme édition):

1. Réponse acceptée

C’est une amélioration par rapport aux réponses d’ Andy et Eric Hu . Leurs réponses créeront un nouvel object tag qui référencera l’ancien object tag et qui porteront le même nom.

Pour illustrer cela, considérez les points suivants:

 > git tag tag1 tag1 -f -a # accepted answer > git rev-list --objects -g --no-walk --all [ example output: ] 6bdcc347fca041a5138f89fdf5276b3ebf9095d5 260ab7928d986472895b8c55e54569b3f3cb9517 tag1 a5797673f610914a45ef7ac051e3ee831a6e7c25 tag1 f22d6308c3cd330a3b0d86b9bf05562faf6b6f17 > git show tag1 tag tag1 Tagger: [tagger] Date: [date of updated tag] [Updated description] tag tag1 Tagger: [tagger] Date: [date of original tag] [Original description] [tagged commit details] 

2. L’amélioration de Sungram

Utiliser ^{} comme second argument de la git tag supprimera à la place toutes les balises précédentes portant le même nom.

Considérons la suite de la session de terminal précédente:

 > git tag tag1 tag1^{} -f -a # suggested improvement > git rev-list --objects -g --no-walk --all [ example output: ] 6bdcc347fca041a5138f89fdf5276b3ebf9095d5 75f02acacfd7d91d55b5bcfdfb1f00aebeed15e3 tag1 f22d6308c3cd330a3b0d86b9bf05562faf6b6f17 > git show tag1 tag tag1 Tagger: [tagger] Date: [date of updated tag] [Updated description] [tagged commit details] 

3. Enregistrer la date

Enfin, si vous souhaitez conserver la date de la balise d’origine comme date de la balise mise à jour, utilisez une magie awk (ou similaire) ou collez simplement la date souhaitée à la place. Ce qui suit remplace le deuxième exemple (sinon la date d’origine serait perdue en raison de la substitution ):

 > GIT_COMMITTER_DATE="$(git show tag1 | # get info about the tag cascade including the date original of the original tag > awk '{ > if ($1 == "Date:") { > print substr($0, index($0,$3)) > } > }' | # extract all the dates from the info > tail -2 | head -1)" `# get the second to last date, as the last one is the commit date` \ > git tag tag1 tag1^{} -a -f # finally, update the tag message, but save the date of the old one > > git rev-list --objects -g --no-walk --all 6bdcc347fca041a5138f89fdf5276b3ebf9095d5 e18c178f2a548b37799b100ab90ca785af1fede0 tag1 f22d6308c3cd330a3b0d86b9bf05562faf6b6f17 > git show tag1 tag tag1 Tagger: [tagger] Date: [date of original tag] [Updated description] [tagged commit details] 

Les références:

  • SO: Liste rapide des objects dans la firebase database git

  • SO: Changer la date du committer d’un tag git

  • Awk: Un tutoriel et une introduction

  • SO: filtre la sortie par premier jeton de ligne et extrait le rest de la ligne avec awk

  • SO: Comment placer un commentaire de ligne bash dans une commande multi-ligne

4. bricolage

Sinon, vous pouvez simplement les supprimer et les créer à nouveau. Comme il s’avère que la mise à jour ajoute simplement une nouvelle balise et la pointe vers l’ancienne, ou bien supprime simplement l’ancienne et en crée une nouvelle pour désigner le même commit.

Vous pouvez y parvenir en émettant:

 > git tag -d  > [GIT_COMMITTER_DATE=] \ > [GIT_AUTHOR_NAME=] \ > git tag  [commit] 

Ici [optional] est un champ facultatif; est un champ obligatoire. Bien sûr, vous pouvez append des indicateurs après la commande git tag que vous feriez normalement.

La solution de @Andy

 git tag   -f -a 

est faux Après ça, avec

 git show 

commande, nous verrons des balises de stack avec le même nom.

Il ajoute une nouvelle balise avec le même nom de balise et le nouveau message à commit . Mais il ne supprime pas les anciennes balises. C’est un cas particulier de cette commande:

 git tag [ | ]  

Mais juste est identique avec .


La solution correcte est simple, il suffit de mettre à jour la balise.

 git tag  -f -a 

Rappelez-vous, seulement UN ici.

Si nous voulons changer de balise, qui n’est pas HEAD , nous avons besoin d’un argument supplémentaire.

 git tag   -f -a 

En utilisant les réponses ci-dessus, ceci est mon alias one-liner pour .gitconfig . Remplace le tag existant et conserve la date de validation.

 [alias] tm = "!sh -c 'f() { export GIT_COMMITTER_DATE=$(git log -1 --format=%ci $0); git tag -f -a $0 $0^{}; }; f '" 

Des améliorations?

nous aimerions que les messages v1.x ressemblent au message v2.0

Avec Git 2.17 (Q2 2018), il y aura une alternative à la création d’une nouvelle balise avec la balise git tag -f -m "" --edit “option qui permet de --edit le message donné via” -m “et” -F “.

Voir commit 9eed6e4 (06 fév 2018) de Nicolas Morey-Chaisemartin ( nmorey ) .
(Fusionné par Junio ​​C Hamano – gitster – dans commit 05d290e , 06 mars 2018)

tag : append l’option --edit

Ajoutez une option --edit qui permet de modifier les messages fournis par -m ou -F , de la même manière que git commit --edit .

Vous devrez étiqueter à nouveau, en utilisant le drapeau de force -f .

 git tag v1.0 -f -m "actual message"