Nous avons plusieurs balises annotées dans notre référentiel git. Les balises plus anciennes contiennent de faux messages 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 faire ressembler les messages v1.x au message v2.0. Quelqu'un sait comment nous ferions cela?
git tag -m "A message" --edit v1.0
serait suffisant. Voir ma réponse cifatal: tag 'v6.6.2' already exists
utilisant2.17.0
.Réponses:
git tag <tag name> <tag name>^{} -f -m "<new message>"
Cela créera une nouvelle balise du même nom (en écrasant l'original).
la source
git tag --help
.git tag <tag name> <tag name> -f -m "<new message>" -m "<new message>" -m "<new message>"
<tag name>^{}
quand vous voulez remplacer leold tag
Pour mettre à jour un message complexe, spécifiez simplement l'option de balise annotée avec
-a
ou l'option de balise signée avec-s
:Cela ouvrira un éditeur avec le contenu de votre ancien message de balise .
la source
git tag <tag name> <tag name>^{} -f -a
Ceci est une amélioration: sans
^{}
cela, un nouvel objet tag sera créé qui référencera l'ancien objet tag, où les deux auront le même nom de tag.<tag name>^{}
résoudra la balise / référence jusqu'à ce qu'il trouve le premier hachage de validation.la source
usage: git tag [-a|-s|-u <key-id>] [-f] [-m <msg>|-F <file>] <tagname> [<head>]
TL; DR
Vous pouvez le faire en supprimant votre tag et en le recréant tout en usurpant la date et l'auteur:
Histoire entière:
S'appuyant sur la réponse de Sungram (initialement proposée comme édition):
1. Réponse acceptée
C'est une amélioration par rapport aux réponses d' Andy et d' Eric Hu . Leurs réponses créeront un nouvel objet balise qui fait référence à l'ancien objet balise et les deux auront le même nom.
Pour illustrer cela, considérez ce qui suit:
2. L'amélioration de Sungram
Utiliser
<tag name>^{}
comme deuxième argument degit tag
va à la place supprimer toutes les balises précédentes portant le même nom.Considérez la poursuite de la session terminale précédente:
3. Enregistrez la date
Enfin, si vous souhaitez conserver la date de la balise d'origine comme date de la balise mise à jour, utilisez un peu de magie awk (ou similaire) ou collez simplement la date de votre choix à la place. Ce qui suit est un substitut pour le deuxième exemple (sinon la date d'origine serait perdue en raison d' une substitution ):
Références:
SO: Liste rapide des objets dans la base de données git
SO: modifier la date de validation d'un tag git
Awk: un tutoriel et une introduction
SO: filtrer la sortie par le premier jeton de ligne et extraire le reste de la ligne avec awk
SO: Comment mettre un commentaire de ligne bash dans une commande multi-ligne
4. DIY
Alternativement à la mise à jour des balises, vous pouvez simplement les supprimer et les recréer. Comme il s'avère que la mise à jour ajoute simplement une nouvelle balise et la fait pointer vers l'ancienne, ou alternativement, supprime implicitement l'ancienne et crée une nouvelle pour pointer vers le même commit de toute façon.
Vous pouvez y parvenir en émettant:
Voici
[optional]
un champ facultatif;<required>
est un champ obligatoire. Bien sûr, vous pouvez ajouter des indicateurs après lagit tag
commande comme vous le feriez normalement.la source
The tagger is controlled by the committer info. (...) GIT_COMMITTER_{NAME,EMAIL}. A tagger isn't really an author.
La solution de @Andy
est faux . Après, avec
, nous verrons des balises de pile portant le même nom.
Il ajoute une nouvelle balise avec le même nom de balise et un nouveau message lors de la validation
<tag-name>
. Mais cela ne supprime pas l'ancienne balise. C'est un cas particulier de cette commande:Mais
<old-tag>
c'est pareil avec<tag-name>
.La solution correcte est simple, il suffit de mettre à jour la balise est OK.
Rappelez - vous, seulement UN ici.
Si nous voulons changer de balise, ce qui n'est pas le cas
HEAD
, nous avons besoin d'un<commit>
argument supplémentaire .la source
git show <tag>
et je vois toutes les éditions précédentes.HEAD
, en passant le supplément<commit>
, la balise ouverte est vide. Je m'attendais à ce que l'ancienne balise soit éditée. Y a-t-il moyen?git tag <commit> <tag-name> -f -a
ait <commit> et <tag-name> inversés? Cela ressemble à cela lorsque vous comparez avec d'autres réponses et les documents, mais je ne suis pas un expert.Avec Git 2.17 (Q2 2018), il y aura une alternative à la création d'une nouvelle balise
git tag <tag name> <tag name> -f -m "<new message>"
, car l' option "git tag
" a appris une explicite "--edit
" qui permet de modifier davantage le message donné via "-m
" et "-F
".Voir commit 9eed6e4 (06 février 2018) par Nicolas Morey-Chaisemartin (
nmorey
) .(Fusionné par Junio C Hamano -
gitster
- en commit 05d290e , 06 mars 2018)Ajoutez une
--edit
option qui permet de modifier les messages fournis par-m
ou-F
, de la même manièregit commit --edit
.la source
--edit
cette adresse du PO?-f
drapeau est également ajouté,--edit
le message sera modifié et l'horodatage sera modifié, non?Vous devrez à nouveau marquer, en utilisant le
-f
drapeau de force.la source
En utilisant les réponses ci-dessus, c'est mon alias one-liner pour
.gitconfig
. Remplace la balise existante et préserve la date de validation.Des améliorations?
la source
tag-amend = "!sh -c 'f() { name=$(git log -1 --format=%an $0); email=$(git log -1 --format=%ae $0); date=$(git log -1 --format=%ci $0); GIT_AUTHOR_NAME=\"${name}\" GIT_COMMITTER _NAME=\"${name}\" GIT_AUTHOR_EMAIL=\"${email}\" GIT_COMMITTER_EMAIL=\"${email}\" GIT_AUTHOR_DATE=\"${date}\" GIT_COMMITTER_DATE=\"${date}\" git tag -f -a $0 $0^{}; }; f '"
Si vous utilisez une interface graphique comme SmartGit juste
la source