Comment cloner le repository git avec une révision / changeset spécifique?

Comment cloner le repository git avec une révision spécifique, comme je le fais habituellement dans Mercurial:

hg clone -r 3 /path/to/repository 

UPDATE 2 Depuis Git 2.5.0, la fonctionnalité décrite ci-dessous peut être activée côté serveur avec la variable de configuration uploadpack.allowReachableSHA1InWant , ici la demande de fonctionnalité GitHub et la validation GitHub permettant cette fonctionnalité . Notez que certains serveurs Git activent cette option par défaut, par exemple Bitbucket Server l’a activé depuis la version 5.5+ . Voir cette réponse sur Stackexchange pour savoir comment activer l’option de configuration.

UPDATE 1 Pour les versions de 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 souhaitez pas récupérer le référentiel complet, vous ne devriez probablement pas utiliser le clone . Vous pouvez toujours utiliser fetch pour choisir la twig 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 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 resortingeved unless # you limit it with '--depth=...' or '--shallow-since=...' git fetch origin  # 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 

Revenir à la plus récente validation

 $ git pull 

Cloner un repository git, clone avec justesse, clone l’intégralité du référentiel: il n’existe aucun moyen de sélectionner une seule révision à cloner. Cependant, une fois que vous effectuez git clone , vous pouvez extraire une révision spécifique en effectuant une checkout .

Si vous voulez dire que vous voulez tout récupérer du début à la fin, la réponse de Charles Bailey est parfaite. Si vous voulez faire l’inverse et récupérer un sous-ensemble de l’historique à partir de la date actuelle, vous pouvez utiliser git clone --depth [N] où N est le nombre de tours de l’historique souhaité. Toutefois:

–profondeur

Créez un clone peu profond avec un historique tronqué au nombre de révisions spécifié. Un référentiel superficiel a un certain nombre de limitations (vous ne pouvez ni le cloner ni le récupérer, ni le pousser ni l’intégrer), mais cela suffit si l’histoire récente d’un grand projet avec une longue histoire vous intéresse. envoyer des correctifs sous forme de correctifs.

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

  1. faire un git clone régulier où vous voulez le repo (obtient tout à jour – je sais, pas ce qui est voulu, nous y arrivons)
  2. git checkout de la rev que vous voulez
  3. git reset --hard
  4. git checkout -b master

TL; DR – Créez simplement une balise dans le référentiel source par rapport à la validation que vous souhaitez cloner et utilisez la balise dans la commande fetch. Vous pouvez supprimer le tag du repository initial pour le nettoyer ultérieurement.

Eh bien, sa réponse acceptée en 2014 et celle de Charles Bailey datant de 2010 sont bel et bien dépassées et la plupart (toutes?) Des autres réponses impliquent le clonage, que de nombreuses personnes espèrent éviter.

La solution suivante permet d’obtenir ce que recherchent l’OP et de nombreux autres, c’est-à-dire un moyen de créer une copie d’un référentiel, y compris l’historique, mais uniquement jusqu’à un certain commit.

Voici les commandes que j’ai utilisées avec git version 2.1.2 pour cloner un repo local (c.-à-d. Un référentiel 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  # 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 de fonctionner pendant encore quelques années! 🙂

Vous pouvez simplement utiliser git checkout

dans cette séquence

bash git clone [URLTORepository] git checkout [commithash]

commit hash ressemble à ceci “45ef55ac20ce2389c9180658fdba35f4a663d204”

En utilisant 2 des réponses ci-dessus ( Comment cloner le repository git avec une révision / changeset spécifique? Et Comment cloner le repository git avec une révision / changeset spécifique? ) Cela m’a aidé à trouver une définition. Si vous voulez cloner jusqu’à un certain point, alors ce point doit être une balise / twig, pas simplement un SHA ou le FETCH_HEAD est confondu. Suite à la récupération de git, si vous utilisez un nom de twig ou de tag, 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 complet du repo complet, à partir de l’origine réelle

 cd  git clone git@:ui-developers/ui.git 

Ensuite, créez une twig locale, au point intéressant

 git checkout 2050c8829c67f04b0db81e6247bb589c950afb14 git checkout -b origin_point 

Ensuite, créez mon nouveau repo vierge, avec ma copie locale comme origine

 cd  mkdir reduced-repo cd reduced-repo git init git remote add local_copy /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 twig 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: Comptage d'objects: 45493, terminé.
 remote: Objets compressés: 100% (15928/15928), terminé.
 distant: Total 45493 (delta 27508), réutilisé 45387 (delta 27463)
 Réception d'objects: 100% (45493/45493), 53,64 Mio |  50,59 Mio / s, fait.
 Résolution des deltas: 100% (27508/27508), terminé.
 De / var / www / html / ui
  * point d'origine de la twig -> FETCH_HEAD
  * [nouvelle twig] origine_point -> origine / origine_point

Maintenant, dans mon cas, je devais ensuite remettre ça sur gitlab, comme un nouveau repo, donc je l’ai fait

 git remote add origin git@: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 | git am -3 -k git --git-dir=../ui/.git format-patch -k -1 --stdout | git am -3 -k to cherry pick à distance puis utilisez git push origin pour télécharger le tout dans sa nouvelle maison.

J’espère que ça aide quelqu’un

Ma version était une combinaison de réponses acceptées et des réponses les plus populaires. 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  $ git fetch --all 

maintenant vous pouvez voir toutes les twigs et commits

 $ git branch -a $ git log remotes/origin/master <-- or any other branch 

Enfin, vous connaissez SHA1 du commit désiré

 git reset --hard  

C’est simple. Il vous suffit de définir l’amont pour la twig en cours

 $ 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 repository)

cd repository (navigate to the repository)

git fetch origin 2600f4f928773d79164964137d514b85400b09b2

git checkout FETCH_HEAD

Pour cloner un seul commit spécifique sur une twig ou un tag particulier:

 git clone --depth=1 --branch NAME https://github.com/your/repo.git 

Malheureusement, NAME ne peut être que nom de twig ou nom de tag (ne pas valider SHA).

--depth drapeau --depth pour télécharger l’historique complet, puis récupérez cette twig 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    

git utilise le mot origin au lieu de la revision populairement connue

Voici un extrait du manuel $ git help clone

 --origin , -o  Instead of using the remote name origin to keep track of the upstream repository, use .