Edit, 24 nov 2016 : cette réponse est apparemment populaire, donc j'ajoute une note ici. Si vous remplacer une étiquette sur un serveur central, toute personne qui a le vieux n'importe quel clone de ce serveur central qui a déjà le tag pourrait conserver son ancienne étiquette . Donc, bien que cela vous indique comment faire, assurez-vous que vous veulent pour le faire. Vous devez faire en sorte que tous ceux qui ont déjà la "mauvaise" étiquette suppriment leur "mauvaise étiquette" et la remplacer par la nouvelle "bonne étiquette".
Les tests effectués dans Git 2.10/2.11 montrent que la conservation de l'ancienne balise est le comportement par défaut pour les clients qui exécutent le programme. git fetch
et la mise à jour est le comportement par défaut pour les clients qui exécutent le programme git fetch --tags
.
(La réponse originale suit.)
Quand vous demandez de pousser les balises, git push --tags
envoie (avec tous les commits et autres objets nécessaires et toutes les autres mises à jour ref des paramètres du push) au distant une demande de mise à jour de la forme _new-sha1_ refs/tags/_name_
. (En fait, il en envoie un nombre illimité : un pour chaque balise).
La demande de mise à jour est modifiée par le distant pour ajouter un old-sha1
(ou encore, un pour chaque balise), puis transmis aux crochets de pré-réception et/ou de mise à jour (selon les crochets existant sur la télécommande). Ces hooks peuvent décider d'autoriser ou de rejeter la création/suppression/mise à jour de l'étiquette.
El old-sha1
est la valeur SHA-1 entièrement zeros "null" si la balise est en cours de création. L'adresse new-sha1
est le SHA-1 nul si la balise est supprimée. Sinon, les deux valeurs SHA-1 sont des valeurs réelles et valides.
Même sans crochet, il y a une sorte de "crochet intégré" qui est également exécuté : la télécommande refusera de déplacer une balise à moins que vous n'utilisiez le drapeau "force" (bien que le "crochet intégré" soit toujours OK avec "add" et "delete"). Le message de rejet que vous voyez provient de ce crochet intégré. (Incidemment, ce même hook intégré rejette également les mises à jour de branches qui ne sont pas des avances rapides). 1
Mais - voici une des clés pour comprendre ce qui se passe - git push
step n'a aucune idée si la télécommande a ce tag maintenant, et si oui, quelle valeur SHA-1 il a. Elle dit seulement "voici ma liste complète de tags, avec leurs valeurs SHA-1". Le distant compare les valeurs et s'il y a des ajouts et/ou des changements, il exécute les hooks sur ceux-ci. (Pour les tags qui sont les mêmes, il ne fait rien du tout. Pour les balises que vous n'avez pas et qu'ils ont, il ne fait rien non plus).
Si vous supprimez la balise localement, alors push
votre poussée ne transfère tout simplement pas l'étiquette. La télécommande suppose qu'aucun changement ne doit être effectué.
Si vous supprimez la balise localement, puis la créez en pointant vers un nouvel endroit, alors push
votre poussée transfère la balise, et la télécommande voit cela comme un changement de balise et rejette le changement, à moins qu'il s'agisse d'une poussée forcée.
Ainsi, vous avez deux options :
- faire une poussée, ou
- supprimer le tag sur la télécommande.
Ce dernier est possible via git push
2 même si la suppression de l'étiquette localement et push
n'a aucun effet. En supposant que le nom de la télécommande est origin
et la balise que vous voulez qu'il supprime est dev
:
git push origin :refs/tags/dev
Cela demande à la télécommande de supprimer la balise. La présence ou l'absence de la balise dev
dans votre dépôt local n'est pas pertinent ; ce genre de push
avec :_remoteref_
en tant que spécification de référence, est une poussée de suppression pure.
La télécommande peut permettre ou non la suppression des balises (en fonction des crochets supplémentaires ajoutés). S'il autorise la suppression, alors la balise sera supprimée, et une seconde balise git push --tags
quand vous avez un local dev
pointant vers un commit ou un objet repo annoté, envoyez votre nouvelle balise dev
tag. Sur la télécommande, dev
sera désormais une balise nouvellement créée, de sorte que la télécommande autorisera probablement le push (cela dépend à nouveau des crochets supplémentaires ajoutés).
La force-poussée est plus simple. Si vous voulez être sûr de ne pas mettre à jour quoi que ce soit autre que l'étiquette, dites simplement git push
pour ne pousser que cette seule refspec :
git push --force origin refs/tags/dev:refs/tags/dev
(note : vous n'avez pas besoin --tags
si vous poussez explicitement une seule balise ref-spec).
1 Bien sûr, le raison pour ce hook intégré est d'aider à faire respecter le comportement que les autres utilisateurs de ce même remote-repo attendent : que les branches ne soient pas rembobinées, et que les tags ne se déplacent pas. Si vous faites du forcing, vous devez faire savoir aux autres utilisateurs que vous faites cela, afin qu'ils puissent le corriger. Notez que "les balises ne bougent pas du tout" est nouvellement appliqué par Git 1.8.2 ; les versions précédentes permettaient à la balise d'"avancer" dans le graphe de commit, tout comme les noms de branches. Voir le Notes de publication de git 1.8.2 .
2 C'est trivial si vous pouvez vous connecter sur la télécommande. Il suffit d'aller sur le dépôt Git et d'exécuter git tag -d dev
. Notez que, quelle que soit la méthode utilisée - effacer la balise sur la télécommande ou utiliser la fonction git push
pour l'effacer - il y a une période de temps pendant laquelle toute personne qui accède à la télécommande trouvera que la dev
est manquante. (Ils continueront à avoir leur propre ancienne étiquette, s'ils l'ont déjà, et ils pourraient même pousser leur l'ancienne balise doit être remontée avant que vous puissiez pousser la nouvelle).
2 votes
Les commits ne sont pas faits "dans les tags" ou "dans les branches" (même si on a l'impression que c'est le cas). En fait, les noms des balises et des branches sont simplement pointer vers (un, unique) engagement. S
10 votes
Cela a fonctionné pour moi
git pull --tags
puisgit push origin --tags
0 votes
Voir aussi stackoverflow.com/questions/31929667/