web-dev-qa-db-fra.com

Extraire une seule balise du référentiel distant

Cette commande va chercher all tags:

git fetch Origin --tags

Cette commande va chercher une balise spécifique:

git fetch Origin refs/tags/1.0.0

Mais ça ne me laisse pas faire:

git checkout tags/2.3.18

Comment puis-je récupérer une seule étiquette et ensuite effectuer une extraction?

10
aleclarson

git fetch Origin refs/tags/1.0.0

Cela échoue car il n'écrit pas de référence locale: il obtient le refs/tags/1.0.0 de la télécommande, ainsi que le ou les objets de balises, les validations, etc., nécessaires pour l'accompagner; il les place dans FETCH_HEAD (comme toutes les commandes git fetch le font toujours); et c'est tout. Il ne crée jamais de référence refs/tags/1.0.0 dans votre référentiel, même s'il dispose de tout le nécessaire pour le faire.

Pour lui faire créer un tel tag s'il n'existe pas encore:

git fetch Origin refs/tags/1.0.0:refs/tags/1.0.0

Le nom à droite des deux points est le nom que votre Git utilisera dans votre référentiel. Vous pouvez transformer cette balise en une branche nommée wacky, par exemple, en la nommant refs/heads/wacky. (Il n'y a aucune raison de faire cela. Je décris cela juste à titre d'illustration.)

Ceci est une extraction non forcée, donc si vous avez déjà un refs/tags/1.0.0, votre Git refusera de mettre à jour votre référence. Si vous souhaitez écraser une balise 1.0.0 existante, utilisez:

git fetch Origin +refs/tags/1.0.0:refs/tags/1.0.0

Si vous souhaitez récupérer toutes les balises, avec ou sans écrasement:

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

avec ou sans signe plus important. (Remarque: les guillemets servent uniquement à protéger le * de votre shell. Le signe plus peut aller à l'intérieur ou à l'extérieur des guillemets. En fait, les guillemets eux-mêmes peuvent aller n'importe où tant qu'ils entourent tous les astérisques ou autres méta-caractères du shell:

refs/tags/'*:refs/tags/*'

ou vous pouvez utiliser des barres obliques inverses à la place:

refs/tags/\*:refs/tags/\*

Dans tous les cas, nous protégeons simplement l'astérisque sensible des fonctions "Les astérisques sont savoureux, on les mange" de Shell.)

21
torek

Lorsque vous spécifiez des références explicites à git fetch, vous devez soit fournir un mappage dans votre refspec , soit faire ce que vous voulez avec l'ID récupéré enregistré dans FETCH_HEAD vous-même.

L'avantage d'avoir le cas non fourni par le mappage ne pas traiter par défaut sur les références extraites est que le cas non fourni par le mappage ne traite pas par défaut les références extraites. Vous pourriez apprécier

git fetch Origin v2.3.18
git tag v2.3.18 FETCH_HEAD    # ← git tag !$ FE<TAB>

lorsque vous ne voulez vraiment que la seule balise configurée dans votre référentiel local et pas autant de dizaines de balises antérieures dans le référentiel d'origine dans l'historique récupéré.

2
jthill

J'ai lu toutes les réponses, mais il n'y a pas encore mentionné un sucre syntaxique. Si vous ne devez extraire qu'une seule balise en tant que balise (à commander ultérieurement), vous pouvez écrire, par exemple pour refs/tags/2.3.18:

git fetch Origin tag 2.3.18 --no-tags

C'est un raccourci pour déjà mentionné: 

git fetch Origin refs/tags/2.3.18:refs/tags/2.3.18 --no-tags

Bien entendu, vous ne pouvez pas utiliser --no-tags si vous avez besoin d'autres balises (selon le comportement par défaut) ou si vous avez déjà explicitement défini --no-tag dans la commande clone ou dans l'option tagOpt config (man git-clone).

git fetch Origin tag 2.3.18
0
Olleg