Comment cloner un dépôt git avec une révision/un ensemble de modifications spécifiques?
Comment puis-je cloner le dépôt git avec une révision spécifique, quelque chose comme je le fais habituellement dans Mercurial:
hg clone -r 3 /path/to/repository
13 réponses
UPDATE 2 depuis git 2.5.0 la fonctionnalité décrite ci-dessous peut être activée côté serveur avec la variable de configurationuploadpack.allowReachableSHA1InWant
, Voici la requête de fonctionnalité GitHub et la validation GitHub activant cette fonctionnalité . Notez que certains serveurs git activent cette option par défaut, par exemple Bitbucket Server l'a activée depuis version 5.5 + . Voir cette réponse sur Stackexchange pour savoir comment activer la configuration option.
Mise à jour 1 pour les versions Git 1.7 < v < 2.5
utilisez git clone et git reset, comme décrit dans la réponse de Vaibhav Bajpai
Si vous ne voulez pas récupérer le référentiel complet, vous ne devriez probablement pas utiliser clone
. Vous pouvez toujours utiliser fetch pour choisir la direction que vous souhaitez récupérer. Je ne suis pas un expert en hg, donc je ne connais pas les détails de -r
mais dans git, vous pouvez faire quelque chose comme ça.
# make a new blank repository in the current directory
git init
# add a remote
git remote add origin url://to/source/repository
# fetch a commit (or branch or tag) of interest
# Note: the full history up to this commit will be retrieved unless
# you limit it with '--depth=...' or '--shallow-since=...'
git fetch origin <sha1-of-commit-of-interest>
# reset this repository's master branch to the commit of interest
git reset --hard FETCH_HEAD
$ git clone $URL
$ cd $PROJECT_NAME
$ git reset --hard $SHA1
Pour revenir à la dernière commit
$ git pull
Si vous voulez dire que vous voulez tout chercher depuis le début jusqu'à un point particulier, la réponse de Charles Bailey est parfaite. Si vous souhaitez faire l'inverse et d'extraire un sous-ensemble de l'histoire à partir de la date actuelle, vous pouvez utiliser git clone --depth [N]
où N est le nombre de tours de l'histoire que vous voulez. Cependant:
--profondeur
Crée un clone superficiel avec un historique tronqué au nombre spécifié de révisions. Un dépôt peu profond a un certain nombre de limites (vous ne pouvez pas cloner ou chercher de lui, ni pousser, ni en elle), mais elle est suffisante si vous êtes uniquement intéressé par l'histoire récente d'un grand projet avec une longue histoire, et voudrait envoyer des correctifs patchs.
Juste pour résumer les choses (git v. 1.7.2.1):
- Faites un
git clone
régulier où vous voulez le repo (obtient tout à ce jour - je sais, pas ce qui est voulu, nous y arrivons) - {[1] } du rev que vous voulez
git reset --hard
git checkout -b master
TL; DR-il suffit de créer une balise dans le référentiel source contre le commit que vous souhaitez cloner et d'utiliser la balise dans la commande fetch. Vous pouvez supprimer la balise du dépôt d'origine plus tard pour la nettoyer.
Eh bien, son 2014 et il semble que la réponse acceptée de Charles Bailey de 2010 est bel et bien dépassée maintenant et la plupart (tous?) parmi les autres réponses, il y a le clonage, que beaucoup de gens espèrent éviter.
La solution suivante réalise ce que sont L'OP et bien d'autres la recherche, qui est une manière de créer une copie d'un dépôt, y compris l'histoire, mais seulement jusqu'à un certain commettre.
Voici les commandes que j'ai utilisées avec git version 2.1.2 pour cloner un repo local (ie. un dépôt dans un autre répertoire) jusqu'à un certain point:
# in the source repository, create a tag against the commit you want to check out
git tag -m "Temporary tag" tmptag <sha1>
# create a new directory and change into that directory
cd somewhere_else;mkdir newdir;cd newdir
# ...and create a new repository
git init
# add the source repository as a remote (this can be a URL or a directory)
git remote add origin /path/to/original/repo
# fetch the tag, which will include the entire repo and history up to that point
git fetch origin refs/tags/tmptag
# reset the head of the repository
git reset --hard FETCH_HEAD
# you can now change back to the original repository and remove the temporary tag
cd original_repo
git tag -d tmptag
Espérons que cette solution continue à fonctionner pendant quelques années de plus! :-)
Vous Pouvez utiliser simplement git checkout <commit hash>
Dans cette séquence
bash
git clone [URLTORepository]
git checkout [commithash]
Le hachage de validation ressemble à ceci "45ef55ac20ce2389c9180658fdba35f4a663d204"
En utilisant 2 des réponses ci-dessus (comment cloner le dépôt git avec une révision/un ensemble de modifications spécifiques? et comment cloner un dépôt git avec une révision/un ensemble de modifications spécifiques?)
M'a aidé à venir avec un definative. Si vous voulez cloner jusqu'à un point, alors ce point doit être une balise/branche pas simplement un SHA ou le FETCH_HEAD est confus. Après l'ensemble git fetch, si vous utilisez un nom de branche ou de balise, vous obtenez une réponse, si vous utilisez simplement un SHA-1, vous n'obtenez pas de réponse.
Voici ce que j'ai fait:-
créer un clone de travail complet du repo complet, à partir de l'origine réelle
cd <path to create repo>
git clone git@<our gitlab server>:ui-developers/ui.git
Ensuite, créez une branche locale, au point qui est intéressant
git checkout 2050c8829c67f04b0db81e6247bb589c950afb14
git checkout -b origin_point
Ensuite, créez mon nouveau dépôt vide, avec ma copie locale comme origine
cd <path to create repo>
mkdir reduced-repo
cd reduced-repo
git init
git remote add local_copy <path to create repo>/ui
git fetch local_copy origin_point
À ce moment-là, j'ai eu cette réponse. Je le note parce que si vous utilisez un SHA-1 à la place de la branche ci-dessus, rien ne se passe, donc la réponse, signifie que cela a fonctionné
/var/www/html/ui-hacking$ git fetch local_copy origin_point remote: Counting objects: 45493, done. remote: Compressing objects: 100% (15928/15928), done. remote: Total 45493 (delta 27508), reused 45387 (delta 27463) Receiving objects: 100% (45493/45493), 53.64 MiB | 50.59 MiB/s, done. Resolving deltas: 100% (27508/27508), done. From /var/www/html/ui * branch origin_point -> FETCH_HEAD * [new branch] origin_point -> origin/origin_point
Maintenant, dans mon cas, j'ai ensuite dû remettre cela sur gitlab, en tant que frais repo donc je l'ai fait
git remote add origin git@<our gitlab server>:ui-developers/new-ui.git
Ce qui signifiait que je pouvais reconstruire mon repo à partir du point d'origine en utilisant git --git-dir=../ui/.git format-patch -k -1 --stdout <sha1> | git am -3 -k
pour sélectionner à distance, puis utiliser git push origin
pour télécharger le lot entier dans sa nouvelle maison.
J'espère que ça aide quelqu'un
Ma version était une combinaison de réponses acceptées et les plus upvoted. Mais c'est un peu différent, car tout le monde utilise SHA1 mais personne ne vous dit comment l'obtenir
$ git init
$ git remote add <remote_url>
$ git fetch --all
Maintenant, vous pouvez voir toutes les branches & s'engage
$ git branch -a
$ git log remotes/origin/master <-- or any other branch
Enfin, vous connaissez SHA1 de commit désiré
git reset --hard <sha1>
C'est simple. Il vous suffit de définir l'amont pour la branche actuelle
$ git clone repo
$ git checkout -b newbranch
$ git branch --set-upstream-to=origin/branch newbranch
$ git pull
C'est tout
git clone https://github.com/ORGANIZATION/repository.git
(cloner le dépôt)
cd repository (navigate to the repository)
git fetch origin 2600f4f928773d79164964137d514b85400b09b2
git checkout FETCH_HEAD
Pour Cloner un seul commit spécifique sur une branche ou une balise particulière, utilisez:
git clone --depth=1 --branch NAME https://github.com/your/repo.git
Malheureusement, NAME
ne peut être que le nom de la branche ou le nom de la balise (pas commit SHA).
Omettez l'indicateur --depth
pour télécharger l'historique complet, puis extrayez cette branche ou cette balise:
git clone --branch NAME https://github.com/your/repo.git
Cela fonctionne avec la version récente de git (Je l'ai fait avec la version 2.18.0
).
git clone -o <sha1-of-the-commit> <repository-url> <local-dir-name>
git
utilise le mot origin
, au lieu de populairement connu revision
Voici un extrait du manuel de $ git help clone
--origin <name>, -o <name>
Instead of using the remote name origin to keep track of the upstream repository, use <name>.