Nous avons plusieurs balises annotées dans notre dépôt git. Les anciennes balises contiennent des messages fictifs que nous aimerions mettre à jour pour qu'ils soient 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 voudrions que les messages v1.x ressemblent au message v2.0. Quelqu'un sait comment on ferait ça?
git tag <tag name> <tag name>^{} -f -m "<new message>"
Cela créera une nouvelle étiquette avec le même nom (en écrasant l'original).
Pour mettre à jour un message complexe, il suffit de spécifier l'option de balise annotée avec -a
ou l’option de balise signée avec -s
:
git tag <tag name> <tag name>^{} -f -a
Cela ouvrira un éditeur avec le contenu de votre ancien message tag.
git tag <tag name> <tag name>^{} -f -a
C'est une amélioration par rapport à Andy et Eric H . Leurs réponses créeront un nouvel objet de balise référençant l'ancien objet de balise, les deux ayant le même nom de balise.
<tag name>^{}
résoudra la balise/référence jusqu'à ce qu'il trouve le premier hachage de validation.
Vous pouvez le faire en supprimant votre tag et en le recréant tout en usurpant la date et l'auteur:
> git tag -d <tag-name>
> [GIT_COMMITTER_DATE=<original-commit-date>] \
> [GIT_AUTHOR_NAME=<original-author-name>] \
> git tag <tag-name> [commit]
Construire sur la réponse de Sungram (proposée à l'origine comme édition):
C'est une amélioration par rapport aux réponses de Andy et Eric H . Leurs réponses créeront un nouvel objet de balise faisant référence à l'ancien objet de balise et les deux porteront le même nom.
Pour illustrer cela, considérons 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]
En utilisant <tag name>^{}
comme second argument de git tag
à la place supprimera toutes les balises précédentes portant le même nom.
Considérez la poursuite 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]
Enfin, si vous souhaitez conserver la date de la balise d'origine en tant que date de la balise mise à jour, utilisez une magie awk (ou similaire) ou collez simplement la date de votre choix. Ce qui suit est un substitut au deuxième exemple (sinon, la date d'origine serait perdue à cause d'une modification):
> 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]
Références:
SO: Filtre la sortie par premier jeton de ligne et extrait le reste de ligne avec awk
SO: Comment mettre un commentaire de ligne bash dans une commande multiligne
Sinon, vous pouvez simplement les supprimer et les recréer. En fin de compte, la mise à jour ajoute simplement une nouvelle balise et la fait pointer vers l’ancienne, ou bien supprime implicitement l’ancienne et en crée une nouvelle pour pointer de toute façon sur le même commit.
Vous pouvez y parvenir en publiant:
> git tag -d <tag-name>
> [GIT_COMMITTER_DATE=<original-commit-date>] \
> [GIT_AUTHOR_NAME=<original-author-name>] \
> git tag <tag-name> [commit]
Ici [optional]
est un champ facultatif; <required>
est un champ obligatoire. Bien sûr, vous pouvez ajouter n'importe quel drapeau après le git tag
commande que vous feriez normalement.
La solution d'Andy
git tag <tag-name> <tag-name> -f -a
est faux. Après, avec
git show
commande, nous verrons les balises de pile portant le même nom.
Il ajoute une nouvelle balise avec le même nom de balise et un nouveau message à commit <tag-name>
. Mais cela ne supprime pas l'ancienne étiquette. C'est un cas particulier de cette commande:
git tag [<commit> | <old-tag>] <tag-name>
Mais seulement <old-tag>
Est identique à <tag-name>
.
La solution correcte est simple, il suffit de mettre à jour la balise.
git tag <tag-name> -f -a
Rappelez-vous, seulement UN ici.
Si nous voulons changer de balise, ce qui n'est pas HEAD
, nous avons besoin d'un argument supplémentaire <commit>
.
git tag <commit> <tag-name> -f -a
nous aimerions que les messages v1.x ressemblent au message v2.0
Avec Git 2.17 (T2 2018), il y aura une alternative à la création d'une balise nouvelle avec git tag <tag name> <tag name> -f -m "<new message>"
, puisque "git tag
"a appris un explicite" --edit
"option permettant de recevoir le message via" -m
" et "-F
"à éditer davantage.
Voir commit 9eed6e4 (6 février 2018) par Nicolas Morey-Chaisemartin (nmorey
) .
(Fusionnée par Junio C Hamano - gitster
- dans commit 05d290e , 06 mars 2018)
tag
: add--edit
option
Ajouter un --edit
option qui permet de modifier les messages fournis par -m
ou -F
, de la même façon git commit --edit
Est-ce que.
En utilisant les réponses ci-dessus, ceci est mon alias one-liner pour .gitconfig
. Remplace la balise existante 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 '"
Améliorations?
Vous devrez marquer à nouveau, en utilisant le -f
drapeau de force.
git tag v1.0 -f -m "actual message"