Comment renommer un Git tag?

Aujourd'hui, j'ai regardé dans les journaux pour un projet et j'ai réalisé que j'ai fat Doigté un nom d'étiquette il y a quelque temps. Y a-t-il un moyen de renommer l'étiquette? Google n'a pas tourné jusqu'à quelque chose d'utile.

je me rends compte que je pouvais vérifier la version étiquetée et faire une nouvelle étiquette, j'ai même essayé cela. Mais cela semble créer une balise objet qui n'est pas tout à fait droit. Pour un,

git tag -l

l'affiche par rapport à toutes les autres étiquettes. Je n'ai pas de idée si c'est significatif, mais ça me porte à croire que le nouvel objet tag n'est pas tout à fait ce que je veux. Je peux vivre avec ça, parce que je me soucie seulement que le nom de la balise corresponde à la documentation, mais je préfère le faire "correctement", en supposant qu'il y ait une bonne façon de le faire.

987
demandé sur Mark Amery 2009-06-22 22:09:05

9 réponses

Voici comment j'ai renommé une étiquette old en new :

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

le deux-points de la commande push supprime la balise du dépôt distant. Si vous ne le faites pas, Git créera l'ancienne balise sur votre machine lorsque vous tirez.

Enfin, assurez-vous que les autres utilisateurs suppriment la balise supprimée. S'il vous plaît, dites-leur (collègues) d'exécuter la commande suivante:

git pull --prune --tags
1680
répondu Casey Watson 2018-07-28 20:13:38

la question initiale était de savoir comment renommer une étiquette, ce qui est facile: d'abord créer NEW comme alias de L'ancien: git tag NEW OLD puis supprimer L'ancien: git tag -d OLD .

la citation concernant" the Git way " et (in)sanity est fausse, car il s'agit de préserver un nom d'étiquette, mais de le faire renvoyer à un État de dépôt différent.

273
répondu Greg McGary 2018-07-28 20:12:47

en plus des autres réponses:

vous devez d'abord construire un alias du ancien nom de l'étiquette, pointant vers le commit original:

git tag new old^{}

Alors vous devez supprimer l'ancien localement :

git tag -d old

puis supprimer l'étiquette sur votre(s) Emplacement (s) distant (s):

# 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 toi devez ajouter votre nouvelle étiquette à l'emplacement distant. Tant que vous n'avez pas fait cela, la nouvelle étiquette(S) ne sera pas ajouté:

git push origin --tags

Itérer ce pour chaque emplacement distant.

soyez conscient, du implications qu'un changement D'étiquette Git a pour les consommateurs d'un paquet!

101
répondu kaiser 2018-05-18 07:16:09

S'il est publié, vous ne pouvez pas le supprimer (sans risquer d'être goudronné et plumé, c'est-à-dire). Le " Git " est à faire:

la chose saine. Admets que tu as foiré, et utilise un nom différent. D'autres ont déjà vu une étiquette-nom, et si vous gardez le même nom, vous pouvez être dans la situation que deux personnes ont toutes les deux "version X", mais ils ont en fait différent "X"'s. Alors appelle ça "X. 1" et qu'on en finisse.

alternativement,

la chose folle. Vous voulez vraiment d'appeler la nouvelle version "X" aussi, même si d'autres l'ont déjà vu l'ancien. Utilisez encore git-tag-f, comme si vous n'aviez pas déjà publié l'ancienne.

C'est fou parce que:

Git ne change pas (et ne devrait pas changer) les tags derrière le dos des utilisateurs. Donc si quelqu'un a déjà la vieille étiquette, en train de faire un git-pull sur ton arbre ne devrait pas les faire écraser l'ancien.

si quelqu'un a reçu une étiquette de publication de votre part, vous ne pouvez pas simplement changer l'étiquette pour eux en mettant à jour la vôtre. C'est un gros problème de sécurité, en ce sens que les gens doivent pouvoir se fier à leur nom d'étiquette. Si tu veux vraiment faire le truc de la folie, tu dois juste en parler, et dire aux gens que tu as foiré.

Toute la courtoisie de la man pages .

25
répondu Robert Munteanu 2018-07-28 20:10:05

cette page wiki a cette intéressante doublure, qui nous rappelle que nous pouvons pousser plusieurs réfs :

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

et demander à d'autres Cloneurs de faire git pull --prune --tags

Donc, l'idée est de pousser:

voir comme exemple " Change naming convention of tags in a git repository? ".

22
répondu VonC 2017-05-23 11:55:01

comme ajout aux autres réponses, j'ai ajouté un alias pour tout faire en une seule étape, avec une touche de commande plus familière *nix move. L'Argument 1 est l'ancien nom de la balise, l'argument 2 est le nouveau nom de la balise.

[alias]
    renameTag = "!sh -c 'set -e;git tag  ; git tag -d ;git push origin :refs/tags/;git push --tags' -"

Utilisation:

git renametag old new
22
répondu Jared Knipp 2016-07-07 16:00:15

pour les aventureux, cela peut être fait en une seule commande:

mv .git/refs/tags/OLD .git/refs/tags/NEW
6
répondu wolfc 2012-07-13 09:24:39

la partie facile est de renommer les étiquettes locales. Le plus dur est la partie la distance. L'idée derrière cette astuce est de dupliquer l'ancienne étiquette/branche à une nouvelle et supprimer l'ancienne, sans checkout.

à Distance de la balise renommer / branche Distante → tag de conversion: (Avis: :refs/tags/ )

git push <remote_name> <old_branch_or_tag>:refs/tags/<new_tag> :<old_branch_or_tag>

branche Distante renommer / Distance tag → conversion de la branche: (Avis: :refs/heads/ )

git push <remote_name> <old_branch_or_tag>:refs/heads/<new_branch> :<old_branch_or_tag>

sortie renommer une balise distante:

D:\git.repo>git push gitlab App%2012.1%20v12.1.0.23:refs/tags/App_12.1_v12.1.0.23 :App%2012.1%20v12.1.0.23

Total 0 (delta 0), reused 0 (delta 0)
To https://gitlab.server/project/repository.git
 - [deleted]               App%2012.1%20v12.1.0.23
 * [new tag]               App%2012.1%20v12.1.0.23 -> App_12.1_v12.1.0.23
1
répondu zionyx 2017-02-17 13:41:37

quels que soient les problèmes relatifs à la poussée des étiquettes et à la renommage des étiquettes qui ont déjà été poussées, dans le cas où l'étiquette à renommer est une annotée une, vous pouvez d'abord la copier grâce à la ligne de commande suivante:

git tag -a -m "`git cat-file -p old_tag | tail -n +6`" new_tag old_tag^{}

ensuite, vous avez juste besoin de supprimer l'ancienne étiquette:

git tag -d old_tag

j'ai trouvé cette ligne de commande grâce aux deux réponses suivantes:

Edit:

Ayant rencontré des problèmes lors de la synchronisation automatique du réglage des étiquettes fetch.pruneTags=true (décrit dans https://stackoverflow.com/a/49215190/7009806 ), je suggère personnellement à d'abord copier la nouvelle étiquette sur le serveur et puis supprimer l'ancienne. De cette façon, la nouvelle étiquette ne sera pas effacée au hasard lors de la suppression de l'ancienne étiquette et une synchronisation des étiquettes voudrait supprimer la nouvelle étiquette qui n'est pas encore sur le serveur . Ainsi, par exemple, tous ensemble, nous obtenons:

git tag -a -m "`git cat-file -p old_tag | tail -n +6`" new_tag old_tag^{}
git push --tags
git tag -d old_tag
git push origin :refs/tags/old_tag
0
répondu Olivier 2018-09-03 09:25:23