web-dev-qa-db-fra.com

Comment cloner superficiellement un commit spécifique avec la profondeur 1?

Est-il possible de cloner superficiellement un commit spécifique dans un référentiel, c'est-à-dire avec la profondeur 1? Quelque chose comme

git clone http://myrepo.git 728a4d --depth 1

pour obtenir l'état du référentiel tel qu'il est lors de la validation avec SHA 728a4d...?

La motivation est d'éviter d'avoir à cloner l'intégralité du référentiel, puis à vérifier ce commit spécifique, lorsque nous ne sommes intéressés que par l'état du référentiel à ce commit spécifique.

50
Chin

À partir de Git 2.5.0 (qui doit être disponible sur les deux côté client et côté serveur), vous pouvez définir uploadpack.allowReachableSHA1InWant=true côté serveur pour activer la récupération de SHA1 spécifiques:

git init
git remote add Origin <url>
git fetch --depth 1 Origin <sha1>
git checkout FETCH_HEAD

Notez que je n'ai pas trouvé de syntaxe pour le faire avec git clone directement.

41
sschuberth

REMARQUE: Mon exemple n'aide pas à cloner par un hachage de validation, mais il aidera à cloner une balise et à disposer d'un référentiel léger.

Si vous ne devez avoir qu'un seul commit dans votre "clone" et que vous allez utiliser le hash de commit, la réponse courte est [~ # ~] no [ ~ # ~] .

J'utilise cette construction de commande (testée sur v2.13.2.windows.1 ) pour les balises:

git clone --depth 1 [email protected]:VENDOR/REPO.git --branch 1.23.0 --single-branch

1.23.0 - il peut s'agir d'un hachage de validation ou d'une branche.

Exemple complet:

$ git clone --depth 1 [email protected]:Seldaek/monolog.git --branch 1.23.0 --single-branch
Cloning into 'monolog'...
remote: Counting objects: 201, done.
remote: Compressing objects: 100% (188/188), done.
remote: Total 201 (delta 42), reused 32 (delta 5), pack-reused 0
Receiving objects: 100% (201/201), 190.30 KiB | 0 bytes/s, done.
Resolving deltas: 100% (42/42), done.
Note: checking out 'fd8c787753b3a2ad11bc60c063cff1358a32a3b4'.

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>

$ cd monolog

.git taille du répertoire ( 267K vs 2,6M en utilisant clone):

$ du -h --max-depth=0 .git
267K    .git

Je voudrais indiquer, --branch peut prendre une balise/branche.

https://git-scm.com/docs/git-clone#git-clone---branchltnamegt

--branch peut également prendre des balises et détacher le HEAD à ce commit dans le référentiel résultant.

[~ # ~] upd [~ # ~]

En un mot, cela peut prendre des "refs". Vous pouvez en savoir plus ici: Que signifie le message d'erreur git "Le serveur n'autorise pas la demande d'objet non annoncé"?

De plus, il n'y a pas astuces comme:

git fetch --depth 1 Origin <COMMIT_HASH>

Merci @BenjiWiebe de m'avoir signalé mon erreur.

12
Kirby

La réponse immédiate est: vous ne pouvez pas.
Pourquoi? une explication détaillée peut être trouvée ici: Pourquoi n'y a-t-il pas une option de validation spécifique à Git Clone?

Que pouvez vous faire d'autre?

Comment cloner le référentiel dans un commit spécifique? (clone complet)

# Create empty repository to store your content
git clone <url>
git reset <sha-1> --hard

Plus d'informations:

Comment cloner une seule branche?

git clone <url> --branch <branch_name> --single-branch <folder_name>

Comment cloner uniquement le dernier commit d'une branche donnée?

git clone <url> --depth=1 --branch <branch_name> --single-branch <folder_name>

Comment cloner superficiellement un commit spécifique avec la profondeur 1?

Comme l'a commenté @sschuberth: --depth implique --single-branch.

Au lieu de cloner, utilisez la commande fetch:

# fetch a commit (or branch or tag) of interest
# In this case you will have the full history of this commit
git fetch Origin <sha1>
4
CodeWizard

Essayez d'utiliser while dans bash:

git clone --depth=1 $url
i=1; while ! git show $sha1; do git fetch --depth=$((i+=1)); done

C'est assez lent car il récupère chaque commit individuellement; vous pouvez augmenter l'incrément (pour récupérer les validations par lots et améliorer les performances sur un réseau), mais c'est toujours une approche par force brute.

2
Corin