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?
$ 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>
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.
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.
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.
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.
Balises de liste:
git tag
0.0.1
0.1.0
Exporter un tag:
git archive -o /tmp/my-repo-0.1.0.Zip --prefix=my-repo-0.1.0/ 0.1.0
Remarques:
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.)
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!
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.
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.
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.
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.
essayer:
git clone -b <name_of_the_tag> <repository_url> <destination>
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.
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 ; \