Est-ce que «git fetch –tags» inclut «git fetch»?

Une question simple et sympathique – la fonction de “git fetch” est-elle un sous-ensemble ssortingct de – git fetch --tags ?

Si je lance git fetch --tags , y a-t-il une raison de lancer git fetch immédiatement après?

Qu’en est-il de git pull et de git pull --tags ? Même situation?

Remarque: à partir de git 1.9 / 2.0 (T1 2014) , git fetch --tags récupère les balises en plus de celles récupérées par la même ligne de commande sans l’option.

Voir commettre c5a84e9 par Michael Haggerty (mhagger) :

Auparavant, l’option ” --tags ” de --tags était considérée comme équivalente à la spécification de refspec

 refs/tags/*:refs/tags/* 

sur la ligne de commande; en particulier, la configuration remote..refspec été ignorée.

Mais il n’est pas très utile de récupérer des balises sans chercher d’autres références, alors qu’il est très utile de pouvoir récupérer des balises en plus d’ autres références.
Alors changez la sémantique de cette option pour faire la seconde.

Si un utilisateur veut extraire uniquement des balises, il est toujours possible de spécifier une référence explicite:

 git fetch  'refs/tags/*:refs/tags/*' 

Veuillez noter que la documentation antérieure à 1.8.0.3 était ambiguë à propos de cet aspect du comportement ” fetch --tags “.
Commit f0cb2f1 (2012-12-14) fetch --tags fait correspondre la documentation à l’ancien comportement.
Cette validation modifie la documentation pour correspondre au nouveau comportement (voir Documentation/fetch-options.txt ).

Demander que toutes les balises soient extraites de la télécommande en plus de tout ce qui est récupéré .


Puisque Git 2.5 (Q2 2015) git pull --tags est plus robuste:

Voir commit 19d122b par Paul Tan ( pyokagan ) , 13 mai 2015.
(Fusionné par Junio ​​C Hamano – gitster – dans commit cc77b99 , 22 mai 2015)

pull : remove --tags error dans aucun cas de fusion

Puisque 441ed41 (” git pull --tags “: erreur avec un meilleur message., 2007-12-28, Git 1.5.4+), git pull --tags imprime un message d’erreur différent si git-fetch n’est pas revenu tout candidat à la fusion:

 It doesn't make sense to pull all tags; you probably meant: git fetch --tags 

En effet, à ce moment-là, les git-fetch --tags remplacent toutes les refspecs configurées, et il n’y aurait donc pas de candidats à la fusion. Le message d’erreur a donc été introduit pour éviter toute confusion.

Cependant, depuis c5a84e9 ( fetch --tags : fetch tags en plus d’ autres choses, 2013-10-30, Git 1.9.0+), git fetch --tags irait chercher les tags en plus des refspecs configurés.
Par conséquent, si aucune situation de candidats de fusion ne se produit, ce n’est pas parce que --tags été défini. En tant que tel, ce message d’erreur spécial est désormais sans importance.

Pour éviter toute confusion, supprimez ce message d’erreur.


Avec Git 2.11+ (Q4 2016), Git Fetch est plus rapide.

Voir commit 5827a03 (13 oct. 2016) par Jeff King ( peff ) .
(Fusion par Junio ​​C Hamano – gitster – dans commit 9fcd144 , 26 oct. 2016)

fetch : utilise “quick” has_sha1_file pour suivre la balise

Lors de la récupération à partir d’une télécommande comportant de nombreux tags sans rapport avec les twigs que nous suivons, nous avions l’habitude de perdre beaucoup de cycles lorsque nous vérifiions si l’object indiqué par une balise (que nous n’allons pas récupérer!) Existe dans notre référentiel. trop soigneusement.

Ce patch apprend à utiliser HAS_SHA1_QUICK pour sacrifier la précision de la vitesse, dans les cas où nous pourrions être racés avec un reconditionnement simultané.

Voici les résultats du script perf inclus, qui définit une situation similaire à celle décrite ci-dessus:

 Test HEAD^ HEAD ---------------------------------------------------------- 5550.4: fetch 11.21(10.42+0.78) 0.08(0.04+0.02) -99.3% 

Cela ne vaut que pour une situation où:

  1. Vous avez beaucoup de packs côté client pour rendre reprepare_packed_git() coûteux (la partie la plus chère consiste à trouver des doublons dans une liste non sortingée, qui est actuellement quadratique).
  2. Vous avez besoin d’un grand nombre de références de balise côté serveur qui sont susceptibles d’être suivies automatiquement (c’est-à-dire que le client n’a pas). Chacun déclenche une relecture du répertoire du pack.
  3. Dans des circonstances normales, le client suivrait automatiquement ces balises et après une grande extraction, (2) ne serait plus vrai.
    Mais si ces balises pointent vers l’historique qui est déconnecté de ce que le client récupère, il ne suivra jamais automatiquement et ces candidats auront un impact sur chaque extraction.

Remarque: cette réponse est uniquement valide pour git v1.8 et versions antérieures.

La plupart de cela a été dit dans les autres réponses et commentaires, mais voici une explication concise:

  • git fetch extrait tous les en-têtes de twig (ou tous ceux spécifiés par l’option de configuration remote.fetch), tous les commits nécessaires pour eux et tous les tags accessibles depuis ces twigs. Dans la plupart des cas, toutes les balises sont accessibles de cette manière.
  • git fetch --tags récupère tous les tags, tous les commits nécessaires pour eux. Il ne mettra pas à jour les têtes de twigment, même si elles sont accessibles depuis les balises récupérées.

Résumé: Si vous voulez vraiment être à jour, n’utiliser que fetch, vous devez faire les deux.

Ce n’est pas non plus “deux fois moins lent”, sauf si vous voulez dire en tapant sur la ligne de commande, auquel cas les alias résolvent votre problème. Il n’y a essentiellement pas de frais généraux dans la production des deux demandes, car elles demandent des informations différentes.

Je vais y répondre moi-même.

J’ai déterminé qu’il y a une différence. “git fetch –tags” peut apporter toutes les balises, mais n’apporte pas de nouveaux commits!

Il faut faire cela pour être totalement “à jour”, c’est-à-dire répliquer un “git pull” sans la fusion:

 $ git fetch --tags $ git fetch 

C’est dommage, car c’est deux fois plus lent. Si seulement “git fetch” avait la possibilité de faire ce qu’il fait normalement et d’ introduire toutes les balises.

Le problème général ici est que git fetch ira chercher +refs/heads/*:refs/remotes/$remote/* . Si l’un de ces commits comporte des balises, celles-ci seront également récupérées. Cependant, si des twigs ne sont accessibles par aucune twig de la télécommande, elles ne seront pas récupérées.

L’option --tags passer refspec à +refs/tags/*:refs/tags/* refs +refs/tags/*:refs/tags/* . Vous pourriez demander à git fetch de saisir les deux. Je suis sûr de faire juste un git fetch && git fetch -t vous utiliseriez la commande suivante:

 git fetch origin "+refs/heads/*:refs/remotes/origin/*" "+refs/tags/*:refs/tags/*" 

Et si vous voulez en faire la valeur par défaut pour ce repository, vous pouvez append une deuxième refspec à la récupération par défaut:

 git config --local --add remote.origin.fetch "+refs/tags/*:refs/tags/*" 

Cela appenda une seconde ligne d’ fetch = dans le .git/config pour cette télécommande.


J’ai passé du temps à chercher le moyen de gérer cela pour un projet. C’est ce que j’ai trouvé.

 git fetch -fup origin "+refs/*:refs/*" 

Dans mon cas, je voulais ces fonctionnalités

  • Prenez toutes les têtes et tous les tags de la télécommande, utilisez donc refspec refs refs/*:refs/*
  • Ecraser les twigs et les balises locales avec non-avance rapide + avant refspec
  • Remplacer la twig actuellement extraite si nécessaire -u
  • Supprimer les twigs et les tags non présents dans remote -p
  • Et force d’être sûr

Dans la plupart des cas, git fetch devrait faire ce que vous voulez, qui consiste à «récupérer quelque chose de nouveau dans le repository distant et à le placer dans votre copie locale sans fusionner avec vos twigs locales». git fetch --tags exactement ce que fait git fetch --tags , sauf qu’il n’y a rien d’autre que de nouveaux tags.

En ce sens, git fetch --tags n’est en aucun cas un sur-ensemble de git fetch . C’est en fait exactement le contraire.

git pull , bien sûr, n’est rien d’autre qu’un wrapper pour un git fetch ; git merge git fetch ; git merge . Il est recommandé de s’habituer à la git fetch manuelle des données et à la git merge avant de passer à l’action simplement parce que cela vous aide à comprendre ce que git pull fait en premier lieu.

Cela étant dit, la relation est exactement la même que pour git fetch . git pull est le sur-ensemble de git pull --tags .

 git fetch upstream --tags 

fonctionne très bien, il obtiendra seulement de nouveaux tags et n’obtiendra aucune autre base de code.