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
295
demandé sur Tshepang 2010-08-16 00:45:53

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
146
répondu CB Bailey 2018-08-21 12:47:00
$ git clone $URL
$ cd $PROJECT_NAME
$ git reset --hard $SHA1

Pour revenir à la dernière commit

$ git pull
687
répondu Vaibhav Bajpai 2016-05-16 18:11:06

Cloner un référentiel git, justement, clone tout le référentiel: il n'y a pas moyen de sélectionner une seule révision à cloner. Cependant, une fois que vous effectuez git clone, vous pouvez commander une révision spécifique en faisant checkout <rev>.

49
répondu 2010-08-15 20:49:43

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.

28
répondu Walter Mundt 2010-08-15 22:45:42

Juste pour résumer les choses (git v. 1.7.2.1):

  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)
  2. {[1] } du rev que vous voulez
  3. git reset --hard
  4. git checkout -b master
25
répondu phill 2012-09-03 10:48:43

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! :-)

17
répondu JamesG 2014-11-19 00:33:33

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"

4
répondu M.Othman 2018-02-20 17:55:26

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

2
répondu sibaz 2017-05-23 12:10:40

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>
2
répondu vladkras 2017-08-24 05:50:27

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

1
répondu NEOJPK 2017-10-20 08:10:37

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

1
répondu JeffDropsIT 2018-07-10 06:13:16

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).

0
répondu Peter Kovac 2018-08-09 16:16:35
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>.
-5
répondu hell_ical_vortex 2015-06-06 08:02:01