Les balises git sont-elles également poussées?

190

Depuis que j'ai créé mon référentiel, il semble que les balises que j'ai créées ne soient pas transmises au référentiel. Lorsque je le fais git tagsur le répertoire local, toutes les balises sont présentes, mais lorsque je me connecte au référentiel distant et que je fais une git tag, seules les premières apparaissent.

Quel pourrait être le problème?.

vfclists
la source
3
git push --follow-tagspeut maintenant être utile, voir ma réponse ci
VonC
1
D'accord avec le double: bien que ce soit plus ancien, l'autre question est mieux posée.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Réponses:

247

Vous pouvez faire ceci:

git push --tags
eevar
la source
27
Je suis à peu près sûr que cela signifie que les références HEAD ne seront pas poussées, ce qui signifie que vous appuyez UNIQUEMENT sur les balises.
Dan Rosenstark
47
"Je recommande de ne pas utiliser ou de former d'autres personnes à l'utilisation, git push --tagscar il peut être très très difficile de se débarrasser des mauvaises balises lorsque vos collègues sont formés pour pousser toutes les balises, car les gens continuent à pousser les anciennes balises erronées qu'ils ont localement chaque fois qu'ils voulez pousser une nouvelle balise. Pour cette raison, je ne conseillerai à personne de l'utiliser git push origin <tag_name>maintenant. " - copié de stackoverflow.com/a/5195913/4130619
activité de réduction du
Je pense que l'autre réponse, stackoverflow.com/a/16164809/11635 devrait être acceptée. Même si ce n'est pas le cas, il doit absolument être lu - il fournit des avantages et des inconvénients et, finalement, une réponse plus pratique et correcte pour aujourd'hui
Ruben Bartelink
140

Dans la configuration distante par défaut de git, vous devez pousser les balises explicitement (alors qu'elles sont récupérées automatiquement avec les commits vers lesquelles elles pointent). Vous devez utiliser

$ git push <remote> tag <tagname>

pour pousser une seule balise, ou

$ git push <remote> --tags

pour pousser toutes les balises (ou git push --tagspour pousser vers la télécommande par défaut, généralement origin).

C'est un comportement très intentionnel, pour rendre explicite les balises push. Pousser des balises doit généralement être un choix conscient.


Résumer ce que Junio ​​C. Hamano a écrit (lié dans les commentaires de @Andre Miras)

Lors de la récupération, vous interagissez avec un référentiel distant que quelqu'un a publié, ce qui signifie:

  1. l'ensemble des balises qui existent là-bas sont toutes les balises que l'éditeur voulait que les internautes voient, et
  2. non seulement vous mais d'autres personnes verront également les mêmes balises.

En d'autres termes, les balises des référentiels que vous récupérez sont conçues pour être publiques et partagées. Cela facilitera la communication entre les développeurs s'il est facile pour tout le monde de récupérer ces mêmes balises.

C'est pourquoi il git fetch"suit" automatiquement les balises, c'est-à-dire qu'il télécharge les balises lors du téléchargement des révisions vers lesquelles elles pointent - en d'autres termes télécharge toutes les balises publiées pertinentes .

Lorsque vous effectuez un push, vous effectuez un push depuis votre référentiel de travail, qui la plupart du temps n'est pas public, et les balises de ce référentiel ne sont pas conçues pour être publiques. Vous pouvez utiliser vos propres balises locales pour marquer votre progression, il n'est donc pas logique de pousser aveuglément toutes les balises de votre référentiel vers le référentiel que vous poussez pour publier vos modifications, dont les balises sont par définition publiques.

C'est pourquoi vous devez pousser la balise explicitement, pour la marquer comme publique.


Vous pouvez également configurer la télécommande vers laquelle vous poussez pour toujours pousser toutes les balises, par exemple, mettez quelque chose comme ça dans votre .git/config:

["publier" à distance] # ou quel que soit son nom
    url = ...
    push = + refs / heads / *: refs / heads / *
    push = + refs / tags / *: refs / tags / *

Cela signifie forcer toutes les têtes (toutes les branches) et toutes les balises (si vous ne voulez pas forcer la poussée des têtes, supprimez le préfixe «+» de refspec).

Jakub Narębski
la source
Cela ne fait-il pas toujours une «poussée forcée» de toutes les têtes?
Stefan Näwe
@Stefan: Oui, c'est vrai. Actualisé.
Jakub Narębski
19
"C'est un comportement très intentionnel, pour rendre les balises de poussée explicites. Pousser des balises devrait généralement être un choix conscient." Je ne comprends pas la raison. Pouvez-vous expliquer pourquoi il serait mauvais pour Git de pousser automatiquement les balises?
Ryan Lundy
13
@Kyralessa, dans ce post git.661346.n2.nabble.com/… , Junio ​​C Hamano (actuel mainteneur de Git) explique pourquoi c'est une mauvaise chose de pousser automatiquement les balises.
Andre Miras
@AndreMiras Merci pour ce lien génial. Ce serait bien si nous pouvions intégrer le post de Junio ​​dans cette réponse.
Homer6
67

Notez que depuis git 1.8.3 (22 avril 2013) , vous n'avez plus à faire 2 commandes pour pousser les branches, puis pour pousser les balises:

La nouvelle --follow-tagsoption " " indique à " git push" de pousser les balises annotées pertinentes lors de la sortie des branches .

Vous pouvez maintenant essayer, lorsque vous envoyez de nouveaux commits:

git push --follow-tags

Cependant, cela ne poussera pas toutes les balises locales, seulement celles annotées référencées par des commits qui sont poussées avec l'extension git push.


Ceci a été introduit dans le commit c2aba15 par Junio ​​C Hamano ( gitster) :

La nouvelle option " --follow-tags" dit " git push" de pousser les balises annotées qui manquent de l'autre côté et qui peuvent être atteintes par l'historique qui est autrement expulsé.

Par exemple, si vous utilisez le push " simple", " current" ou " upstream", vous devriez normalement pousser l'historique menant au commit à votre niveau actuel HEADet rien d'autre.
Avec cette option, vous transférez également toutes les balises annotées qui peuvent être atteintes à partir de ce commit vers l'autre côté.


La config push.followTagspermet d'inclure --follow-tagspar défaut (Git 2.4.1+, Q2 2015). Voir " Push git commits & tags simultanément "

VonC
la source
3
Cela ne pousse que toutes les balises annotées . La plupart des personnes / projets utilisent des balises légères . Donc, dans la plupart des cas, git push --follow-tagsne pousse pas plus quegit push
Jarl
3
@Jarl oui, j'ai mentionné "annoté" dans ma réponse. Mais je n'ai vraiment utilisé que des balises annotées, réservant des balises légères à un usage purement interne (c'est-à-dire jamais destinées à être poussées de toute façon).
VonC
@VonC: Maintenant, il y a aussi une option de configuration qui en fait la valeur par défaut, comme vous l'avez noté ici: stackoverflow.com/a/3745250/946850
krlmlr
19

Ce que je fais habituellement, c'est:

["publier" à distance] # ou quel que soit son nom
    url = ...
    pousser =:
    push = + refs / tags / *: refs / tags / *

Cela signifie qu'il pousse toutes les branches déjà présentes, plus les balises. Il ne force pas la poussée et ne pousse pas la branche que vous n'avez pas poussée manuellement.

tapis
la source
Puis-je également mettre cela dans la configuration git globale de mon utilisateur? Si oui, comment? Merci! :)
gucki
Il semble que vous forcez les balises, mais pas les branches.
Adrian Ratnapala
Eh bien, oui, et non, j'ai écrit ça, ça va pousser de nouvelles balises, ça ne forcera pas les pousser, et ça ne poussera pas les branches que vous n'avez pas encore poussées vous-même.
mat
J'ai essayé la suggestion de Jakub, mais c'était de pousser des branches que je ne voulais que localement. Cette suggestion, passe-partout, fonctionne parfaitement. Il synchronise les balises mais ne synchronise pas les branches sauf s'il s'agit de branches de suivi distantes (c'est-à-dire qu'il ne poussera pas de nouvelles branches vers la télécommande, mais les mettra à jour si elles sont déjà dans la télécommande). REMARQUE: si vous avez une balise et une branche avec le même nom, vous obtenez une erreur "correspond à plus d'un". Reportez-vous à lostechies.com/jasonmeridth/2010/02/27/refspec-matches-more-than-one/ .
josephdpurcell
5

Et si vous voulez forcer la récupération de toutes les balises, vous pouvez le définir dans la configuration par:

git config remote.origin.tagopt --tags

À partir de la documentation:

La définition de cette valeur sur --no-tags désactive le suivi automatique des balises lors de la récupération à distance. Le paramétrer sur --tags récupérera toutes les balises à distance, même si elles ne sont pas accessibles depuis les têtes de branche distantes. Passer ces indicateurs directement à git-fetch (1) peut remplacer ce paramètre. Voir les options --tags et --no-tags de git-fetch (1).

boryne
la source
1
La question était plus orientée «push», votre réponse s'applique-t-elle également lorsque vous poussez vers une télécommande?
a1an