web-dev-qa-db-fra.com

Comment cloner un dépôt git avec une révision / changeset spécifique?

Comment puis-je cloner le dépôt git avec une révision spécifique, comme je le fais habituellement dans Mercurial:

hg clone -r 3 /path/to/repository
349
John

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

UPDATE 1 Pour les versions Git _1.7 < v < 2.5_, utilisez git clone et réinitialisez git, comme décrit dans 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 branche que vous souhaitez récupérer. Je ne suis pas un expert en matière de santé, 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 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
_
170
CB Bailey
$ git clone $URL
$ cd $PROJECT_NAME
$ git reset --hard $SHA1

Pour revenir au commit le plus récent

$ git pull
794
Vaibhav Bajpai

Le clonage d’un référentiel git clone l’ensemble du référentiel: il n’existe pas de moyen de sélectionner une seule révision à cloner. Cependant, une fois que vous avez exécuté git clone, vous pouvez extraire une révision spécifique en exécutant checkout <rev>.

50
user113292

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 qui remonte à la date actuelle, vous pouvez utiliser git clone --depth [N] où N est le nombre de tours de l'historique que vous souhaitez. Pourtant:

--profondeur

Créez un clone peu profond avec un historique tronqué au nombre de révisions spécifié. Un dépôt peu profond comporte un certain nombre de limitations (vous ne pouvez ni le cloner ni en extraire, ni le pousser de ou vers l'intérieur), mais est suffisant si vous ne vous intéressez qu'à l'histoire récente d'un grand projet avec une longue histoire et que vous souhaitez envoyer des correctifs sous forme de correctifs.

30
Walter Mundt

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

  1. faites un git clone régulier où vous voulez le repo (tout est à jour - je sais, pas ce que l'on veut, on y arrive)
  2. git checkout <sha1 rev> du tour que vous voulez
  3. git reset --hard
  4. git checkout -b master
24
phill

TL; DR - Créez simplement une balise dans le référentiel source en regard du commit que vous voulez cloner et utilisez la balise dans la commande fetch. Vous pouvez supprimer la balise du dépôt d'origine ultérieurement pour la nettoyer.

Eh bien, c'est 2014 et il semble que la réponse acceptée par Charles Bailey de 2010 soit bel et bien dépassée et la plupart (toutes?) Des autres réponses impliquent le clonage, ce que beaucoup de gens espèrent éviter.

La solution suivante permet d'obtenir ce que le PO et beaucoup d'autres recherchent, à savoir 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 référentiel local (c'est-à-dire 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 <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 encore quelques années! :-)

19
JamesG

Vous pouvez simplement utiliser git checkout <commit hash>

dans cette séquence

bash git clone [URLTORepository] git checkout [commithash]

commit hash ressemble à ceci "45ef55ac20ce2389c9180658fdba35f4a663d204"

12
M.Othman

Pour cloner n seul commit spécifique sur une branche ou un tag particulier, utilisez:

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

Malheureusement, NAME ne peut être qu'un nom de branche ou un nom de balise (pas commettre SHA).

Omettez l'indicateur --depth pour télécharger l'historique complet, puis vérifiez cette branche ou cette étiquette:

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

10
Peter Kovac

Utiliser 2 des réponses ci-dessus ( Comment cloner un référentiel git avec une révision/ensemble de modifications spécifique? et Comment cloner un référentiel git avec une révision/un ensemble de modifications spécifique? ) m'a aidé à accéder avec un definatif. Si vous voulez cloner jusqu'à un point, alors ce point doit être une balise/branche et pas simplement un SHA ou le FETCH_HEAD devient confus. Après le 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 dépôt complet, à partir de l'origine réelle

cd <path to create repo>
git clone git@<our gitlab server>:ui-developers/ui.git 

Créez ensuite une branche locale, au point qui est intéressant

git checkout 2050c8829c67f04b0db81e6247bb589c950afb14
git checkout -b Origin_point

Créez ensuite mon nouveau dépôt vierge, 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 stade, j'ai eu cette réponse. Je le remarque 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: Comptage d'objets: 45493, terminé. 
 remote: Compression d'objets: 100% (15928/15928) ), terminé. 
 remote: Total 45493 (delta 27508), réutilisé 45387 (delta 27463) 
 Réception d'objets: 100% (45493/45493), 53,64 MiB | 50,59 Mio/s, terminé. 
 Résolution des deltas: 100% (27508/27508), terminé. 
 À partir de /var/www/html/ui
 * Branche Origin_point -> FETCH_HEAD 
 * [nouvelle branche] Origin_point -> Origin/origin_point 

Maintenant, dans mon cas, j’avais alors besoin de le remettre sur gitlab, comme une nouvelle prise en pension, alors j’ai

git remote add Origin git@<our gitlab server>:ui-developers/new-ui.git

Ce qui signifiait que je pouvais reconstruire mon référentiel à partir de Origin_point en utilisant git --git-dir=../ui/.git format-patch -k -1 --stdout <sha1> | git am -3 -k pour effectuer une sélection à distance, puis en utilisant git Push Origin pour le télécharger dans son nouveau domicile.

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

2
sibaz

Ma version était une combinaison de réponses acceptées et les plus votées. 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 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 <sha1>
2
vladkras

git clone https://github.com/ORGANIZATION/repository.git (clone le référentiel)

cd repository (navigate to the repository)

git fetch Origin 2600f4f928773d79164964137d514b85400b09b2

git checkout FETCH_HEAD

0
JeffDropsIT

J'utilise cet extrait avec GNU make pour fermer une balise de révision, une branche ou un hachage

il a été testé sur la version 2.17.1 de git

${dir}:
    mkdir -p ${@D}
    git clone --recursive --depth 1 --branch ${revison} ${url} ${@} \
 || git clone --recursive --branch ${revison} ${url} ${@} \
 || git clone ${url} ${@}
    cd ${@} && git reset --hard ${revison}
    ls $@




0
RzR

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

0
NEOJPK