web-dev-qa-db-fra.com

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

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 étiquette pour la version précédente sur la page Web git, avec le nom d'objet de quelque chose de long nombre hexadécimal.

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

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

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

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

Si c'est le référentiel entier, comment puis-je obtenir la version que je cherche? Si non, comment puis-je télécharger cette version particulière?

1851
Jack BeNimble
$ git clone

vous donnera le référentiel entier.

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

$ git checkout tags/<tag_name>

Mieux encore, vérifiez 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>
2788
besen
git clone --branch my_abc http://git.abc.net/git/abc.git

Clonera le dépôt et vous laissera sur l'étiquette qui vous intéresse.

Documentation pour 1.8.0 of git clone.

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

371
Toni

Pour extraire 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 s'intéresse uniquement au code le plus récent plutôt qu'à un référentiel complet. De cette façon, il ressemble à la commande 'svn co'.

Remarque: Per le manuel Git , le passage de l'indicateur --depth implique le comportement de --single-branch par défaut.

--profondeur

Créez un clone peu profond avec un historique tronqué au nombre spécifié de commits. Implique --simple-branche à moins que --no-single-branch ne soit donné pour rechercher les historiques près des extrémités de toutes les branches. Si vous voulez cloner des sous-modules de manière superficielle, passez également - sous-modules-bas-fonds.

147
Yuan HOng

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

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

OR

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 séparée". (manuel git-checkout)

Chaque dépôt git contient l'historique complet des révisions. Par conséquent, son clonage vous permet d'accéder au dernier commit, ainsi qu'à tout ce qui a précédé, y compris le tag que vous recherchez.

97
grossvogel

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

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. Balises de liste:

    git tag
    
    0.0.1
    0.1.0
    
  2. Exporter un tag:

    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 ramassé par le nom du fichier de sortie.
    • En spécifiant le préfixe, votre code sera exporté dans un répertoire (si vous incluez une barre oblique finale).
79
Chris J

tilisez le commutateur --single-branch) (disponible à partir de Git 1.7.10) . La syntaxe est la suivante:

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 (obligera) à résoudre les deltas uniquement pour la branche/balise spécifiée - tout en vérifiant le même nombre de fichiers! En fonction du référentiel source, cela vous permettra d'économiser beaucoup d'espace disque. (En plus, ça va être beaucoup plus rapide.)

52
eyecatchUp

d'abord chercher toutes les balises dans cette télécommande spécifique

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

o tapez simplement

git fetch <remote>

Puis vérifiez 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!

27
tk_

Si vos tags sont triables à l'aide de la commande linux sort, utilisez ceci:

git tag | sort -n | tail -1

par exemple. si git tag renvoie:

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

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

v1.0.5

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

v1.0.4

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

pour extraire la balise, commencez par cloner le dépôt, puis tapez:

git checkout v1.0.4

..ou quelle que soit l'étiquette dont vous avez besoin.

17
Peter Johnson
git fetch <gitserver> <remotetag>:<localtag>

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

Je viens de faire ça. Je me suis d'abord assuré de connaître 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 sa balise, cette étape n'est donc pas nécessaire pour tout le monde. La sortie ressemblait à ceci, même si la liste réelle était 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

Je l'ai ensuite étiqueté sur ma machine locale, en 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 l'ont suggéré, car le projet sur lequel je travaille est vaste et que je souhaite développer dans un environnement propre et agréable. Je pense que cela est plus proche des questions initiales "J'essaie de comprendre comment télécharger une balise particulière" que de 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'il souhaite consulter le code source de 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 branche et je ne voulais pas que ça change. Mon intention était de récupérer le logiciel que je voulais pour pouvoir sélectionner quelque chose et l'ajouter à mon développement.

Il existe probablement un moyen d'extraire la balise elle-même plutôt qu'une simple copie du commit qui a été marqué. Je devais marquer le fetched commit moi-même EDIT: Ah oui, je l'ai trouvé maintenant.

git fetch gitserver Fix_110:Fix_110

Là où vous voyez les deux points, c'est remote-name: local-name et ici ce sont les noms de balises. Cela fonctionne sans bouleverser l’arbre de travail, etc. Il semble simplement copier des éléments de la télécommande sur 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 permettra de voir ce que la commande ferait, si vous voulez vérifier ce que vous voulez. Donc je suppose un simple

git fetch gitserver remotetag:localtag

est la vraie réponse.

=

Une note séparée à propos des balises ... Quand je commence quelque chose de nouveau, j’ai l'habitude de marquer le dépôt vide après git init, car

git rebase -i XXXXX 

nécessite un commit, et la question qui se pose est "comment pouvez-vous rebasonner les modifications qui incluent votre première modification logicielle?" Alors quand je commence à travailler je fais

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

c.-à-d. créer un commit avant mon premier changement réel, puis utilisé ultérieurement

git rebase -i EMPTY 

si je veux rebasonner tout mon travail, incluant le premier changement.

16
Ivan

J'ai vérifié le documentation git checkout , il a révélé une chose intéressante:

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

Ainsi, nous pouvons mentionner le nom de la balise (car balise n’est autre que le nom d’un commit), par exemple:

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

P.S: 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 en tant que branche, puis la valider, puis créer une balise distincte.

16
None-da

En me basant sur la réponse de Peter Johnson, je me suis créé un joli petit alias:

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

aka 'git checkout latest tag'.

Cela repose sur la version GNU de la sorte, qui gère de manière appropriée des situations comme celle que lOranger a signalée:

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

Si vous êtes sur un Mac, brew install coreutils puis appelez plutôt gsort.

8
billwanjohi

essayer:

git clone -b <name_of_the_tag> <repository_url> <destination>
6
Kamil Zając

vérification des balises

Si vous souhaitez afficher les versions des fichiers pointés par une balise, vous pouvez effectuer une extraction git, même si cela place votre référentiel dans l'état "UNAD HEAD", 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 "en tête détaché", si vous apportez des modifications puis créez un commit, la balise restera la même, mais votre nouveau commit n'appartiendra à aucune branche et sera inaccessible, à l'exception du hachage de commit exact. Ainsi, si vous devez apporter des modifications (par exemple, vous corrigez un bogue sur une version antérieure), 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 tag v2.0.0 car elle ira de l'avant avec vos nouvelles modifications, alors faites attention.

5
artamonovdev

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 ; \
4
J0hnG4lt