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.

36
demandé sur Chin 2015-07-07 23:43:48

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 .

23
répondu sschuberth 2017-03-31 08:36:32

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>
4
répondu CodeWizard 2017-05-23 12:02:02

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.

2
répondu Corin 2017-02-20 23:52:36

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.

2
répondu Kirby 2018-03-14 13:33:52