web-dev-qa-db-fra.com

Est-ce que les tags git sont aussi poussés?

Depuis que j'ai créé mon référentiel, il apparaît que les balises que j'ai créées ne sont pas placées dans le référentiel. Quand je fais git tag sur le répertoire local, toutes les balises sont présentes, mais lorsque je me connecte au référentiel distant et que je fais un git tag, seules les premières apparaissent.

Quel pourrait être le problème?.

173
vfclists

Vous pourriez faire ceci:

git Push --tags
225
eevar

Dans la configuration distante par défaut de git, vous devez explicitement utiliser les balises (tant qu'elles sont récupérées automatiquement avec les commits sur lesquels elles pointent. Vous devez utiliser

$ git Push <remote> tag <tagname>

pousser une seule étiquette, ou

$ git Push <remote> --tags

pousser tous les tags (ou git Push --tags to Appuyer sur la télécommande par défaut, généralement Origin).

Ceci est un comportement très destiné à rendre explicites les balises push. Pousser les tags devrait être un choix conscient.


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

Lors de la récupération, vous interagissez avec un référentiel distant publié par une personne, ce qui signifie:

  1. l'ensemble des balises qui existent il y a tout l'éditeur que les gens voulaient voir, 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 extrayez 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 d'extraire ces mêmes balises.

Voilà pourquoi git fetch "suit automatiquement" les balises, c’est-à-dire qu'il télécharge les balises lors du téléchargement des révisions qu’ils désignent - en d’autres termes, télécharge tous les balises publiées pertinentes.

En poussant, vous poussez 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 est donc inutile de pousser aveuglément toutes les balises de votre référentiel dans 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 explicitement la balise, pour la marquer comme publique.


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

 [remote "publish"] # ou quoi que ce soit appelé 
 url = ... 
 Push = + refs/heads/*: refs/heads /*
 Push = + refs/tags/*: refs/tags /*

Cela signifie force Poussez toutes les têtes (toutes les branches) et toutes les balises (si vous ne voulez pas forcer les têtes, supprimez le préfixe '+' de refspec).

134
Jakub Narębski

Notez que depuis git 1.8.3 (22 avril 2013) , vous n'avez plus besoin de faire 2 commandes à Push branches, puis à Push tags:

Le nouveau "--follow-tags "option dit" git Push Poussez les balises annotées pertinentes lorsque vous ouvrez des branches .

Vous pouvez maintenant essayer, en poussant de nouveaux commits:

git Push --follow-tags

Cela ne va pas pousser tous les balises locales cependant, seulement les annotées celles référencées par les commits qui sont poussés avec le git Push.


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

La nouvelle option "--follow-tags "dit" git Push "to Pousser les étiquettes annotées qui manquent de l’autre côté et qui peuvent être atteintes par l’historique qui est par ailleurs poussé.

Par exemple, si vous utilisez les commandes "simple", "current" ou "upstream", vous enverrez normalement l'historique menant à la validation à votre HEAD et rien d'autre.
Avec cette option, vous pouvez également pousser toutes les balises annotées pouvant être atteintes depuis ce commit vers l’autre côté.


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

59
VonC

Ce que je fais habituellement c'est:

 [remote "publish"] # ou quoi que ce soit nommé 
 url = ... 
 Push =: 
 Push = + refs/tags/*: refs /Mots clés/*

Cela signifie que toutes les branches déjà présentes sont repoussées, plus les balises. Cela ne force pas Push, et ne pousse pas les branches que vous n'avez pas poussées manuellement.

19
mat

Et si vous voulez forcer l'extraction de tous les tags, vous pouvez le définir dans la configuration en:

git config remote.Origin.tagopt --tags

De la docs:

Définir cette valeur sur --no-tags désactive le suivi automatique des balises lors de la récupération à distance. Si vous le définissez sur --tags, toutes les balises seront récupérées, même si elles ne sont pas accessibles depuis les têtes de branches distantes. Le passage de ces drapeaux directement à git-fetch (1) peut remplacer ce paramètre. Voir les options --tags et --no-tags de git-fetch (1).

4
boryn