Comment faire pour cloner superficiellement une commit spécifique avec depth 1?
est-il possible de cloner superficiellement une propagation spécifique dans un dépôt, c'est-à-dire avec la profondeur 1? Quelque chose comme
git clone http://myrepo.git 728a4d --depth 1
pour obtenir l'état du dépôt tel qu'il est à la propagation avec SHA 728a4d...
?
La motivation est d'éviter d'avoir à cloner le dépôt entier, puis vérifier que spécifique commettre, lorsque nous sommes seulement intéressés dans l'état du dépôt à cette validation.
4 réponses
à partir de git 2.5.0 (qui doit être disponible à à la fois du côté client et du côté serveur) , vous pouvez définir uploadpack.allowReachableSHA1InWant=true
du côté serveur pour permettre la récupération de SHA1s 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 directement avec git clone
.
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 Commit spécifique au Clone Git?
Que pouvez-vous faire d'autre?
comment cloner un dépôt à une propagation spécifique? (full clone)
# 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 seulement la dernière propagation d'une branche donnée?
git clone <url> --depth=1 --branch <branch_name> --single-branch <folder_name>
comment faire pour cloner superficiellement une propagation spécifique avec la profondeur 1?
comme @sschuberth commente: --depth
implique --single-branch
.
au lieu de clone utiliser 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 parce qu'il récupère chaque commit individuellement; vous pouvez augmenter l'incrément (pour récupérer les commits par lots et améliorer les performances sur un réseau) mais c'est toujours une approche de force brute.
NOTE: mon exemple n'aide pas à cloner par un hachage de propagation mais il aidera à cloner une étiquette et avoir un dépôt léger.
si vous devez avoir un seul commit dans votre" clone "et que vous allez utiliser le hachage de commit, réponse courte est Non .
j'utilise cette construction de commande (Testée sur v2.13.2.Windows.1 ) pour les étiquettes:
git clone --depth 1 git@github.com:VENDOR/REPO.git --branch 1.23.0 --single-branch
1.23.0
- il peut s'agir d'un hachage de propagation ou d'une branche.
exemple complet:
$ git clone --depth 1 git@github.com: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
dir taille ( 267K vs "1519120920 de 2,6 M avec des clone
):
$ du -h --max-depth=0 .git
267K .git
j'aimerais indiquer, --branch
peut prendre une étiquette/branche.
https://git-scm.com/docs/git-clone#git-clone---branchltnamegt
--branch
peut aussi prendre des tags et détacher la tête à cette propagation dans le dépôt résultant.
UPD
En un mot, il peut prendre des "arbitres". Vous pouvez lire plus ici: Que signifie le message d'erreur git "Server does not allow request for unadvertised object"?
aussi, il n'y a pas de trucs comme:
git fetch --depth 1 origin <COMMIT_HASH>
Merci @BenjiWiebe de m'avoir montré du doigt dans mon erreur.