Téléchargez un tag spécifique avec Git

1941

J'essaie de comprendre comment je peux télécharger une balise particulière d'un référentiel Git - c'est une version derrière la version actuelle.

J'ai vu qu'il y avait une balise pour la version précédente sur la page Web de git, avec un nom d'objet quelque chose de long hexadécimal.

Mais le nom de la version est " Tagged release 1.1.5" selon le site.

J'ai essayé une commande comme celle-ci (avec des noms modifiés):

git clone http://git.abc.net/git/abc.git my_abc

Et j'ai obtenu quelque chose - un répertoire, un tas de sous-répertoires, etc.

Si c'est l'ensemble du référentiel, comment puis-je obtenir la version que je recherche? Sinon, comment télécharger cette version particulière?

Jack BeNimble
la source
11
Je développe sur un référentiel complètement différent de celui de la production, donc ma production ne connaissait aucun tag lorsque j'ai essayé d'utiliser git checkout. La solution était d'utiliser "git pull --tags" puis d'utiliser git checkout.
Architecte d'entreprise
11
"git fetch --tags" fonctionne aussi
John Erck
16
Pour éviter de cloner tout le référentiel puis de passer à une balise, vous pouvez directement faire a clone -b "Tagged release 1.1.5" http://git.abc.net/git/abs.git my_abc. Cela ne fonctionnera que si vous n'avez pas de succursale avec le même nom bien sûr (selon votre méthodologie, cela peut ne jamais arriver).
RedGlyph
3
@RedGlyph Merci, je vais l'essayer. Sinon, nous pouvons faire comme ça. git checkout -b new-branch tag-name. Maintenant, clonez votre nouvelle branche. Quand nous le voulons, nous pouvons supprimer la nouvelle branche.
kalidasan

Réponses:

2871
$ git clone

vous donnera l'ensemble du référentiel.

Après le clone, vous pouvez répertorier les balises avec $ git tag -lpuis extraire une balise spécifique:

$ git checkout tags/<tag_name>

Encore mieux, passez à la caisse et créez une branche (sinon vous serez sur une branche nommée d'après le numéro de révision de la balise):

$ git checkout tags/<tag_name> -b <branch_name>
besen
la source
15
Oui. git est différent de la subversion à cet égard. Une balise svn copie essentiellement les fichiers dans un nouveau dossier, vous pouvez donc extraire svn un groupe spécifique de fichiers, tandis que les balises git sont simplement des pointeurs vers des révisions spécifiques.
dbr
5
Et si vous avez une branche et une étiquette qui portent le même nom? Si vous dites simplement «git checkout <nom>», il dit «avertissement: le nom de référence '<nom>» est ambigu.
MatrixFrog
54
lors d'une vérification et comme Derek l'a mentionné, le dépôt entre dans un état de "tête détachée". à la place, ajoutez le -bdrapeau indiquant à git de créer une nouvelle branche et spécifiez un nom de branche:git checkout <tag_name> -b <branch_name>
hellatan
22
@hellatan Vous ne devriez le faire que lorsque vous voulez réellement créer une branche, mais la plupart du temps vous ne le faites probablement pas. Courir dans un état "tête détachée" ne vous fera pas de mal, et est probablement exactement ce que vous voulez si vous voulez simplement vérifier un peu l'historique de Git.
machineghost
4
Dans la version git 1.8.3.5et plus récente, le --branch <tag ref>devrait vous permettre de télécharger le référentiel à partir de votre en <tag ref>tant que repo HEAD; combiné avec --depth 1fera une vérification d'étiquette peu profonde. Voir stackoverflow.com/a/21699307/1695680
ThorSummoner
410
git clone --branch my_abc http://git.abc.net/git/abc.git

Clonera le dépôt et vous laissera sur le tag qui vous intéresse.

Documentation pour 1.8.0 des états du clone git .

--branch peut également prendre des balises et détacher le HEAD lors de cette validation dans le référentiel résultant.

Toni
la source
7
Cela fonctionne (au moins maintenant) pour les balises, même si vous vous retrouvez dans un état HEAD détaché.
mxcl
72
Pour info: spécifiez également --depth 1pour éviter de télécharger les validations non actuelles.
Acumenus
4
Cela ne fonctionne en effet pas avec les balises. Seules les branches. Edit: il semble que seules les versions plus récentes de git le prennent en charge.
lzap
Nous pouvons également éditer .git / config (ou le configurer d'une manière ou d'une autre) pour faire un clone superficiel de deux ou plusieurs balises, si cela peut être nécessaire, mettre à niveau un clone superficiel en clone complet, etc.
Sam Watkins
vous pouvez également spécifier la branche souhaitée avec la balise. Comme la git clone --branch my_abc http://git.abc.net/git/abc.git -b qualityqualité est le nom de la branche que nous voulons btw.
hazimdikenli
180

Pour vérifier uniquement une balise donnée pour le déploiement, j'utilise par exemple:

git clone -b 'v2.0' --single-branch --depth 1 https://github.com/git/git.git

Cela semble être le moyen le plus rapide d'extraire le code d'un référentiel distant si l'on ne s'intéresse qu'au code le plus récent au lieu d'un référentiel complet. De cette façon, il ressemble à la commande «svn co».

Remarque: Selon le manuel de Git , le passage du --depthdrapeau implique --single-branchpar défaut.

--profondeur

Créez un clone superficiel avec un historique tronqué au nombre spécifié de validations. Implique --single-branch sauf si --no-single-branch est donné pour récupérer les historiques près des pointes de toutes les branches. Si vous souhaitez cloner des sous-modules de manière superficielle, passez également --shallow-submodules.

Yuan HOng
la source
10
ne peut pas croire que ce soit compliqué. Je suppose que personne ne s'attend à ce que son code soit utilisé par d'autres.
Ben
9
@Ben, c'est en fait la solution la plus simple (une seule commande est requise)
Eliran Malka
3
@Ben pourquoi est-ce compliqué? C'est un cas d'utilisation spécial avec quelques fonctionnalités que vous souhaitez faire différemment de la valeur par défaut. Bien sûr, vous devez le spécifier. La solution normale serait de vérifier l'ensemble du référentiel dans un vcs distribué .
erikbwork
9
@Ben a raison. git est compliqué af et a été écrit il y a des ANNÉES par Linus et il est le seul à comprendre "vraiment" comment cela fonctionne. xkcd.com/1597
RyanNerd
11
--depth nimplique --single-branch. Vous n'avez pas besoin des deux.
Niyaz
98

Je ne suis pas un expert git, mais je pense que cela devrait fonctionner:

git clone http://git.abc.net/git/abc.git
cd abc
git checkout my_abc 

OU

git clone http://git.abc.net/git/abc.git
cd abc
git checkout -b new_branch my_abc

La deuxième variante établit une nouvelle branche basée sur la balise, ce qui vous permet d'éviter une «tête détachée». (manuel git-checkout)

Chaque dépôt git contient l'historique complet des révisions, donc le clonage du dépôt vous donne accès à la dernière validation, ainsi qu'à tout ce qui précède, y compris la balise que vous recherchez.

grossvogel
la source
4
THX. J'avais besoin d'utiliser git checkout -b b1.5.0 v1.5.0lors de la vérification d'une version dans une branche «gh-pages» pour réussir à pousser vers Github Pages. Ce Gist que j'ai rédigé pourrait aider les autres re: branch / tag / submodules
Chris Jacob
4
Je ne pense pas que ce soit tout à fait exact (par exemple, coller dans le terminal) car vous devez d' abord cdentrer abc/avant de pouvoir commander une succursale
Steven Lu
@StevenLu Vous avez bien sûr raison. J'allais pour des concepts plutôt que pour couper-coller, mais cela pourrait aussi bien être aussi précis que possible. J'ai ajouté le cd.
grossvogel
81

Vous pouvez utiliser git archive pour télécharger une boule tar pour une balise donnée ou un id de commit:

git archive --format=tar --remote=[hostname]:[path to repo] [tag name] > tagged_version.tar

Vous pouvez également exporter une archive zip d'une balise.

  1. Étiquettes de liste:

    git tag
    
    0.0.1
    0.1.0
    
  2. Exporter une balise:

    git archive -o /tmp/my-repo-0.1.0.zip --prefix=my-repo-0.1.0/ 0.1.0
    
  3. Remarques:

    • Vous n'avez pas besoin de spécifier le format. Il sera récupéré par le nom du fichier de sortie.
    • La spécification du préfixe fera exporter votre code vers un répertoire (si vous incluez une barre oblique de fin).
Chris J
la source
3
Cette commande ne fonctionne pas avec les sous-modules, voir stackoverflow.com/questions/1591387/…
Zitrax
3
Mais git archive supprime également le contrôle de version, vous ne pouvez donc pas simplement faire une autre extraction git pour passer à la balise suivante.
idbrii
9
Oui, vous perdez le contrôle de la version, mais le temps gagné par l'archive git par rapport au clone git est ABSOLUMENT INCROYABLE! +1
MarcH
C'est SI PROCHE de ce que je veux, sauf qu'il git archiveme demande un mot de passe quand tout ce que je veux faire est de télécharger à partir d'un dépôt public. Comment puis-je lui faire utiliser http au lieu de ssh?
robru
1
Cela échoue avec les erreurs fatal: Operation not supported by protocol.et Unexpected end of command stream. Alternativement, il peut également renvoyer l' fatal: The remote end hung up unexpectedlyerreur.
Acumenus
52

Utilisez le --single-branchcommutateur (disponible à partir de Git 1.7.10) . La syntaxe est:

git clone -b <tag_name> --single-branch <repo_url> [<dest_dir>] 

Par exemple:

git clone -b 'v1.9.5' --single-branch https://github.com/git/git.git git-1.9.5

L'avantage: Git recevra des objets et (devra) résoudre les deltas pour la branche / balise spécifiée uniquement - tout en vérifiant exactement la même quantité de fichiers! Selon le référentiel source, cela vous fera économiser beaucoup d'espace disque. (De plus, ce sera beaucoup plus rapide.)

eyecatchUp
la source
3
Quiconque a downvote / downvotes cette réponse: Veuillez également laisser un commentaire avec une brève explication pour le downvote. (Je demande juste, parce que je suis un peu confus. Parce que, afaik, c'est la meilleure solution pour le problème donné. Et si vous ne le pensez pas, j'aimerais savoir pourquoi.) Merci beaucoup.
eyecatchUp
5
N'essayez pas de donner trop de sens aux votes négatifs .. votre réponse est très bonne, leurs votes négatifs ne sont probablement pas étayés .. c'est la vie sur SOF ..
javadba
n'a pas fonctionné sur git version 2.22.0.windows.1
Mahesh
29

récupérer d'abord toutes les balises de cette télécommande spécifique

git fetch <remote> 'refs/tags/*:refs/tags/*'

ou tapez simplement

git fetch <remote>

Vérifiez ensuite les balises disponibles

git tag -l

puis passez à cette balise spécifique en utilisant la commande ci-dessous

git checkout tags/<tag_name>

J'espère que cela vous aidera!

tk_
la source
pourquoi utiliser ´git tag -l´ ce devrait être la même chose que ´git tag´?
serup
1
@serup; git tagajoutera une balise alors qu'elle git tag -lrépertorie les balises disponibles
Joost Döbken
18

Si vos balises sont triables à l'aide de la sortcommande linux , utilisez ceci:

git tag | sort -n | tail -1

par exemple. si git tagretourne:

v1.0.1
v1.0.2
v1.0.5
v1.0.4

git tag | sort -n | tail -1 affichera:

v1.0.5

git tag | sort -n | tail -2 | head -1 affichera:

v1.0.4

(parce que vous avez demandé la deuxième balise la plus récente)

pour retirer la balise, clonez d'abord le dépôt, puis tapez:

git checkout v1.0.4

..ou quelle que soit la balise dont vous avez besoin.

Peter Johnson
la source
25
Jusqu'à ce que vous atteigniez la v1.0.10, et puis de mauvaises choses arrivent :)
Laurent Grégoire
10
Pour que vos tags soient triés chronologiquement:git for-each-ref --sort='*authordate' --format='%(tag)' refs/tags
Bob G
One-liner pour git checkout `git tag | sort -n | tail -1`
extraire
Vous voudrez peut-être utiliser à la sort -Vplace de sort -n. Le premier gère correctement les versions, qui ne sont pas nécessairement numériques, par exemple "1.2.3". Il comprend également que "0.4.10" va après "0.4.1" et non après "0.4.2" qui -nvous donnera.
Mateusz Misiorny
16

J'ai vérifié la documentation de git checkout , cela a révélé une chose intéressante:

git checkout -b <new_branch_name> <start_point>, où <start_point> est le nom d'un commit auquel démarrer la nouvelle branche; Par défaut à HEAD

Nous pouvons donc mentionner le nom de la balise (car la balise n'est rien d'autre qu'un nom de commit) comme, par exemple:

>> git checkout -b 1.0.2_branch 1.0.2
plus tard, modifiez certains fichiers
>> git push --tags

PS: Dans Git, vous ne pouvez pas mettre à jour une balise directement (car la balise n'est qu'une étiquette pour une validation), vous devez extraire la même balise qu'une branche, puis vous y engager, puis créer une balise séparée.

Aucun-da
la source
1
Ou si vous ne vous attendez pas à apporter de modifications et que vous souhaitez simplement voir à quoi ressemblait le code dans cette balise, vous pouvez simplement retirer la balise sans créer de branche. Vous obtiendrez un texte expliquant que vous êtes dans l'état "tête détachée", et vous pouvez toujours créer la branche plus tard si vous le souhaitez.
MatrixFrog
16
git fetch <gitserver> <remotetag>:<localtag>

===================================

Je viens de faire ça. Je me suis d'abord assuré que je connaissais l'orthographe du nom de la balise.

git ls-remote --tags gitserver; : or origin, whatever your remote is called

Cela m'a donné une liste de balises sur mon serveur git à choisir. L'affiche originale connaissait déjà le nom de son tag, donc cette étape n'est pas nécessaire pour tout le monde. La sortie ressemblait à ceci, bien que la vraie liste soit plus longue.

8acb6864d10caa9baf25cc1e4857371efb01f7cd    refs/tags/v5.2.2.2
f4ba9d79e3d760f1990c2117187b5010e92e1ea2    refs/tags/v5.2.3.1
8dd05466201b51fcaf4ca85897347d82fcb29518    refs/tags/Fix_109
9b5087090d9077c10ba22d99d5ce90d8a45c50a3    refs/tags/Fix_110

J'ai choisi la balise que je voulais et je l'ai récupérée et rien de plus comme suit.

git fetch gitserver Fix_110

J'ai ensuite marqué cela sur ma machine locale, donnant à ma balise le même nom.

git tag Fix_110 FETCH_HEAD

Je ne voulais pas cloner le référentiel distant comme d'autres personnes l'ont suggéré, car le projet sur lequel je travaille est grand et je veux développer dans un environnement propre et agréable. Je pense que cela est plus proche des questions originales "J'essaie de comprendre comment télécharger UN ÉTIQUETTE PARTICULIÈRE" que la solution qui suggère de cloner l'ensemble du référentiel. Je ne vois pas pourquoi quelqu'un devrait avoir une copie du code source de Windows NT et Windows 8.1 s'ils veulent regarder le code source DOS 0.1 (par exemple).

Je ne voulais pas non plus utiliser CHECKOUT comme d'autres l'ont suggéré. J'ai fait vérifier une succursale et je ne voulais pas affecter cela. Mon intention était de récupérer le logiciel que je voulais pour pouvoir choisir quelque chose et l'ajouter à mon développement.

Il existe probablement un moyen de récupérer la balise elle-même plutôt qu'une simple copie de la validation qui a été balisée. J'ai dû marquer moi-même le commit récupéré. EDIT: Ah oui, je l'ai trouvé maintenant.

git fetch gitserver Fix_110:Fix_110

Où vous voyez les deux points, c'est nom-distant: nom-local et ici ce sont les noms des balises. Cela fonctionne sans perturber l'arborescence de travail, etc. Il semble simplement copier des éléments de la télécommande vers la machine locale afin que vous ayez votre propre copie.

git fetch gitserver --dry-run Fix_110:Fix_110

avec l'option --dry-run ajoutée, vous pourrez voir ce que la commande ferait si vous voulez vérifier ce que vous voulez. Donc je suppose qu'un simple

git fetch gitserver remotetag:localtag

est la vraie réponse.

=

Une note séparée sur les balises ... Quand je commence quelque chose de nouveau, je marque généralement le référentiel vide après git init, car

git rebase -i XXXXX 

nécessite un commit, et la question se pose "comment pouvez-vous rebaser les changements qui incluent votre premier changement de logiciel?" Donc, quand je commence à travailler, je le fais

git init
touch .gitignore
[then add it and commit it, and finally]
git tag EMPTY

c'est-à-dire créer un commit avant mon premier vrai changement et ensuite l'utiliser plus tard

git rebase -i EMPTY 

si je veux rebaser tout mon travail, y compris le premier changement .

Ivan
la source
8

À partir de la réponse de Peter Johnson, je me suis créé un joli petit alias:

alias gcolt="git checkout $(git tag | sort -V | tail -1)"

alias «dernière balise git checkout».

Cela s'appuie sur la version GNU, qui gère de manière appropriée des situations comme celle que lOranger a souligné:

v1.0.1
...
v1.0.9
v1.0.10

Si vous êtes sur un Mac, brew install coreutilspuis appelez gsort à la place.

billkw
la source
6

essayer:

git clone -b <name_of_the_tag> <repository_url> <destination>
Kamil Zając
la source
S'il existe plusieurs branches pour le référentiel, quelle branche sera clonée?
tauseef_CuriousGuy
5

Extraire les balises

Si vous souhaitez afficher les versions des fichiers vers lesquels pointe une balise, vous pouvez effectuer une extraction git, bien que cela place votre référentiel dans l'état "HEAD détaché", ce qui a des effets secondaires néfastes:

$ git checkout 2.0.0
Note: checking out '2.0.0'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b <new-branch-name>

HEAD is now at 99ada87... Merge pull request #89 from schacon/appendix-final

$ git checkout 2.0-beta-0.1
Previous HEAD position was 99ada87... Merge pull request #89 from schacon/appendix-final
HEAD is now at df3f601... add atlas.json and cover image

Dans l'état "HEAD détaché", si vous apportez des modifications puis créez une validation, la balise restera la même, mais votre nouvelle validation n'appartiendra à aucune branche et sera inaccessible, sauf par le hachage de validation exact. Ainsi, si vous devez apporter des modifications (par exemple, si vous corrigez un bogue sur une ancienne version), vous souhaiterez généralement créer une branche:

$ git checkout -b version2 v2.0.0
Switched to a new branch 'version2'

Si vous faites cela et faites un commit, votre branche version2 sera légèrement différente de votre balise v2.0.0 car elle avancera avec vos nouvelles modifications, alors soyez prudent.

artamonovdev
la source
4

Je le fais via l'API github:

curl -H "Authorization: token %(access_token)s" -sL -o /tmp/repo.tar.gz "http://api.github.com/repos/%(organisation)s/%(repo)s/tarball/%(tag)s" ;\
tar xfz /tmp/repo.tar.gz -C /tmp/repo --strip-components=1 ; \
J0hnG4lt
la source
1
Cela fonctionne pour les branches et les balises, mais pas pour le chef de master qui a besoin d'une balise créée contre lui. Imho moyen assez élégant pour obtenir une version de taille minimale.
J0hnG4lt