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.
À 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.
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.
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?
# Create empty repository to store your content
git clone <url>
git reset <sha-1> --hard
Plus d'informations:
git clone <url> --branch <branch_name> --single-branch <folder_name>
git clone <url> --depth=1 --branch <branch_name> --single-branch <folder_name>
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>
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.