1355 votes

Comment renommer un tag Git ?

Aujourd'hui, je regardais les journaux d'un projet et je me suis rendu compte que j'avais trouvé un nom de balise il y a quelque temps. Existe-t-il un moyen de renommer le tag ? Google n'a rien trouvé d'utile.

Je sais que je peux vérifier la version balisée et créer une nouvelle balise, j'ai même essayé. Mais cela semble créer un objet tag qui n'est pas tout à fait correct. Par exemple,

git tag -l

la liste n'est pas ordonnée par rapport à toutes les autres balises. Je n'ai aucune idée si cela est significatif, mais cela m'amène à penser que le nouvel objet balise n'est pas tout à fait ce que je veux. Je peux m'en accommoder, car la seule chose qui m'importe est que le nom de la balise corresponde à la documentation, mais je préférerais faire les choses "correctement", en supposant qu'il y ait un moyen correct de le faire.

0 votes

Avez-vous utilisé la même invocation, c'est-à-dire que si l'ancienne balise était une balise annotée/signée, la nouvelle balise est-elle également de ce type, ou s'agit-il d'une balise légère ?

1 votes

Tant l'ancienne balise incorrecte que la nouvelle balise souhaitée doivent être annotées et non signées. L'ancien tag a été créé avec 'git tag -a bad_tag_name', j'aimerais donc faire quelque chose du type 'git tag -a good_tag_name'.

0 votes

Je dois préciser que je souhaite également que ce processus magique de renommage des balises préserve l'annotation de la balise qui est renommée. En fait, j'aimerais vraiment ne changer que le nom et rien d'autre.

2264voto

Casey Watson Points 9986

Voici comment je renomme une balise old a new :

git tag new old
git tag -d old
git push origin new :old

Le deux-points dans la commande push supprime la balise du référentiel distant. Si vous ne faites pas cela, Git créera l'ancienne balise sur votre machine lorsque vous tirerez. Enfin, assurez-vous que les autres utilisateurs suppriment la balise supprimée. Veuillez leur dire (collègues de travail) d'exécuter la commande suivante :

git pull --prune --tags

Notez que si vous modifiez une balise annotée vous devez vous assurer que l'option nouveau nom de balise fait référence au commit sous-jacent et non pas à l'ancienne balise annotée annoté que vous êtes sur le point de supprimer. Par conséquent, utilisez git tag -a new old^{} au lieu de git tag new old (ceci est dû au fait que les balises annotées sont des objets alors que les balises légères ne le sont pas, Plus d'informations dans cette réponse ).

9 votes

Une chose à noter est que si vous utilisez git tag new old est que "old" se retrouve dans la balise "new" si "old" n'est pas une balise légère. Pour voir cela, essayez : git tag -m tralala old; git tag new old; git tag -d old; git cat-file tag new | grep old . C'est parce que "new" pointe vers la balise "old", et non vers le commit vers lequel "old" pointe.

3 votes

Pour supprimer une ancienne balise de la télécommande, vous pouvez également effectuer les opérations suivantes git push -d [remote] [tag] .

0 votes

confluence.atlassian.com/bitbucket/ a également été utile pour moi.

310voto

Greg McGary Points 1876

La question originale était de savoir comment renommer une balise, ce qui est facile : créez d'abord NEW comme alias de OLD : git tag NEW OLD puis supprimez OLD : git tag -d OLD .

La citation concernant "la méthode Git" et l'(in)bon sens est erronée, parce qu'il s'agit de préserver un nom de balise, mais en lui faisant faire référence à un état de dépôt différent.

3 votes

La réponse ci-dessus est légèrement préférable car elle inclut la git push origin des affaires.

0 votes

La méthode la plus simple, qui fonctionne très bien pour renommer une étiquette de version précédente créée avec Gitflow.

9 votes

Avertissement : Utilisation de git tag new old créera une balise pointant vers l'ancienne balise, pas le commit de l'ancien tag. (Voir Pourquoi ne puis-je pas vérifier mon tag à partir de l'interface graphique de Git ? )

123voto

kaiser Points 4137

En plus des autres réponses :

Vous devez d'abord créer un alias de la vieux qui pointe vers le commit original :

git tag new old^{}

Ensuite, vous devez supprimer l'ancien localement :

git tag -d old

Supprimez ensuite la balise sur votre ou vos sites distants :

# Check your remote sources:
git remote -v
# The argument (3rd) is your remote location,
# the one you can see with `git remote`. In this example: `origin`
git push origin :refs/tags/old

Enfin, vous devez ajouter votre nouvelle balise à l'emplacement distant. Tant que vous n'avez pas effectué cette opération, la ou les nouvelle(s) balise(s) ne sera pas être ajouté :

git push origin --tags

Répétez cette opération pour chaque site distant.

Soyez conscient, de la les implications qu'un changement de Tag Git a aux consommateurs d'un paquet !

0 votes

Avertissement : Utilisation de git tag new old créera une balise pointant vers l'ancienne balise, pas le commit de l'ancien tag. (Voir Pourquoi ne puis-je pas vérifier mon tag à partir de l'interface graphique de Git ? )

1 votes

@StevenVascellaro Merci pour le lien. Pour la prochaine fois, veuillez déposer un modifier - répondre est aussi un effort communautaire. Merci.

0 votes

Je n'ai pas fait de modification parce que je n'ai pas encore testé le code pour moi-même. (Notez la date de soumission sur la question liée)

28voto

VonC Points 414372

Cette page wiki a cette phrase intéressante, qui nous rappelle que nous pouvons pousser plusieurs références :

git push origin refs/tags/<old-tag>:refs/tags/<new-tag> :refs/tags/<old-tag> && git tag -d <old-tag>

et demander aux autres cloneurs de le faire git pull --prune --tags

L'idée est donc de pousser :

  • <new-tag> pour chaque commits référencé par <old-tag> : refs/tags/<old-tag>:refs/tags/<new-tag> ,
  • la suppression de <old-tag> : :refs/tags/<old-tag>

Voir par exemple " Changer la convention de nommage des balises dans un dépôt git ? ".

0 votes

Cela préserve-t-il les annotations ?

1 votes

Attention, cette laisse le nom du tag original dans l'annotation pour les balises annotées ! Je ne suis pas sûr que cela implique quoi que ce soit, du moins dans les versions actuelles.

0 votes

@gbr Pouvez-vous modifier la réponse avec un exemple montrant que le "nom du tag original" est laissé dans l'annotation ?

26voto

Robert Munteanu Points 31558

S'il est publié, vous ne pouvez pas le supprimer (sans risquer de vous faire goudronner et plumer). La "méthode Git" consiste à le faire :

La chose la plus saine. Admettre que tu as merdé, et utiliser un autre nom. Les autres ont déjà vu un nom de tag, et si vous gardez le même nom, vous risquez de vous retrouver dans la situation où deux personnes ont toutes deux la "version X", mais ont en fait des "X" différents. Il suffit donc de l'appeler "X.1" et d'en finir.

Alternativement,

La chose insensée. Vous voulez vraiment appeler la nouvelle version "X" aussi, même si les autres ont déjà vu l'ancienne. Il suffit donc d'utiliser à nouveau git-tag -f, comme si vous n'aviez pas déjà publié l'ancienne.

C'est tellement fou parce que :

Git ne change pas (et ne devrait pas) les balises dans le dos des utilisateurs. Donc, si quelqu'un a déjà l'ancienne balise, faire un git-pull sur votre arbre ne devrait pas simplement lui faire écraser l'ancienne.

Si quelqu'un a obtenu une balise de publication de votre part, vous ne pouvez pas simplement changer la balise pour lui en mettant à jour votre propre balise. Il s'agit d'un problème de sécurité important, dans la mesure où les gens DOIVENT pouvoir faire confiance à leur nom de tag. Si vous voulez vraiment faire une chose insensée, vous devez tout simplement l'avouer et dire aux gens que vous vous êtes trompé.

Avec l'aimable autorisation de la pages de manuel .

6 votes

Ou vous pouvez étiqueter (avec le nom correct) cette étiquette incorrectement nommée.

7 votes

Merci, j'ai déjà parcouru cette page de manuel un million de fois. Heureusement, le mauvais tag n'a été publié nulle part. Même s'il l'était, il s'agit d'un projet interne et je suis le seul développeur (pour le moment). Je pense que je suis relativement à l'abri du goudron et de la plume, mais seulement si je peux faire correspondre le dépôt à la documentation.

0 votes

J'utilise parfois les tags pour mes références personnelles. Par exemple, il pourrait s'agir d'un tag 'ok_jb'. Je l'utilise parce que certaines des personnes avec lesquelles je travaille ne peuvent pas construire pour ma plateforme, et il y a donc parfois des erreurs de construction. Je peux alors obtenir rapidement une version qui se construit, en vérifiant cette balise. Lorsque les nouvelles sources sont construites, je déplace simplement l'étiquette, ou je la renomme en builds##, où ## est un nombre (selon le projet). Je peux également souligner l'introduction d'une fonctionnalité spéciale en ajoutant une balise.

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