Comment git fetch efficacement à partir d'un clone simple
Nous utilisons git pour la distribution d'un système d'exploitation et le garder jusqu'à ce jour. Nous ne pouvons pas distribuer la totalité du référentiel car il est trop grand, (>2 GO), donc nous avons été en utilisant faible clones (~300M). Cependant récemment, lors de l'extraction à partir d'un clone simple, c'est désormais inefficace récupère la totalité de l' >2 GO de référentiel. C'est intenable gaspillage de bande passante pour les déploiements.
Le git de la documentation dit que vous ne pouvez récupérer à partir d'un faible dépôt, bien que c'est strictement faux. Existe-il des solutions de contournement pour faire un git clone --depth 1
en mesure de récupérer tout ce qui a changer? Ou une autre stratégie pour garder le distribution de la taille la plus petite possible tout en ayant tous les bits git a besoin de faire une mise à jour?
J'ai essayé, sans succès, le clonage à partir de --depth 20
pour voir si elle va de la mise à niveau de manière plus efficace, qui ne fonctionne pas. J'ai aussi regarder dans http://git-scm.com/docs/git-bundle, mais qui semble créer d'énormes ballots.
- "mais qui semble créer d'énormes ballots": uniquement pour le premier. Après cela, vous pouvez créer des différentiels de faisceaux.
- Ma première distribution ne peut pas être énorme...
- Vous devrez essayer de nouveau chercher de votre clone simple avec Git 1.9/2.0 (T1 2014): ces opérations sont maintenant beaucoup plus efficace. Voir ma réponse ci-dessous
- Git 2.5 (T2 2015) prend en charge une seule extraction de s'engager! J'ai édité ma réponse ci-dessous, maintenant référencement "Pull spécifique de commettre distance à partir d'un dépôt git".
Vous devez vous connecter pour publier un commentaire.
--depth
est ungit fetch
option. Je vois le doc n'a pas vraiment de souligner quegit clone
fait un fetch.Lorsque vous chercher, les deux repos swap info sur qui a de quoi en commençant à partir de la distance de la tête et de la recherche en arrière pour la plus récente de validation partagée dans la prochaine refs de l'histoire, puis de remplir tous les objets manquants pour terminer juste la nouvelle s'engage entre le plus récent partagé s'engage et le nouvellement extraites ceux.
Un
--depth=1
simplement aller chercher reçoit les conseils de branche et pas d'antécédents. Autres extractions de ces histoires va chercher tout ce qui est nouveau par la procédure ci-dessus, mais si les cheveux ne s'engage pas dans la nouvelle extraite de l'histoire, de récupérer allons récupérer tout cela, à moins que de vous limiter le chercher avec--depth
.Votre client n'a une profondeur=1 récupération d'un repo et mis les url à un autre repo. Au moins une longue ascendance chemin dans ce nouveau repo de refs apparemment actions ne s'engage à rien actuellement dans votre pension. Qui pourrait être intéressant, à étudier, mais de toute façon, sauf si il y a une raison particulière, vos clients peuvent juste faire tous les fetch
--depth=1
.git ls-remote
ne montre tags/branches ...](https://www.kernel.org/pub/software/scm/git/docs/git-fetch.html#_named_remote_in_configuration_file) entry in
fetch`s discussion sur la façon de configurer les télécommandes)git ls-remote
vous dira tout de la télécommande refs,git branch -a
etgit tag
vous dis à tous ceux que vous avez.git fetch -v -v -v
J'ai trouvé pour être très utile btwJuste fait
g clone github.com:torvalds/linux
et il a fallu beaucoup de temps, donc j'ai simplement sauté parCTRL+C
.Puis n'a
g clone github.com:torvalds/linux --depth 1
et il n'a cloné assez rapide. Et je n'ai qu'un commit dansgit log
.Donc
clone --depth 1
devrait fonctionner. Si vous avez besoin de mettre à jour référentiel existant, vous devez utilisergit fetch origin branchname:branchname --depth 1
. Il travaille trop, il extrait un seul commit.En résumé:
Clone Initial:
Mise à jour du Code
branch:branch
Noter que Git 1.9/2.0 (T1 2014) pourrait être plus efficace dans l'extraction d'un clone simple.
Voir s'engager 82fba2b, de Nguyễn Thái Ngọc Duy (
pclouds
):Tous les détails sont dans "
faible.c
: les 8 étapes pour choisir les nouveaux commits pour.git/peu profonde
".Vous pouvez voir la conséquence de l'engage comme 0d7d285, f2c681c, et c29a7b8 qui soutiennent clone, envoyez-pack /receive-pack avec/de faible clones.
smart-http prend désormais en charge superficielle d'extraction/clone trop.
Vous pouvez même clone forme un peu repo.
Mise à jour 2015: git 2.5+ (Q2 2015) permettra même pour un commit unique d'extraction! Voir "Pull spécifique de commettre distance à partir d'un dépôt git".
Mise À Jour En 2016 (Oct.): git 2.11+ (T4 2016) permet de récupérer:
--shallow-since=<date>
--deepen=N
Si vous pouvez sélectionner une branche spécifique, il peut être encore plus rapide. Voici un exemple d'utilisation de l'Étincelle branche master et dernière balise:
Clone Initial
Mise à jour des balises spécifiques
Il devient très vite basculer tags/direction de cette façon.
Je ne sais pas si c'suites de votre set-up, mais ce que j'utilise est d'avoir ha plein clone d'une mise en pension dans un répertoire séparé. Alors je ne peu profonde clone du dépôt distant avec référence à la locale.
De cette façon, seulement les différences avec le référentiel et la télécommande sont en fait extraites. Pour le rendre encore plus rapide, vous pouvez utiliser le
--shared
option, mais assurez-vous de lire sur les restrictions à lagit
documentation (ça peut être dangereux).Aussi j'ai découvert que, dans certaines circonstances, lorsque la distance a changé beaucoup de choses, le clone commence à aller chercher de trop de données. Il est bon de le casser alors et mise à jour de la référence repo (qui étrangement prend beaucoup moins de bande passante qu'il a fallu en premier lieu.) Et puis démarrez le clone de nouveau.
fatal: reference repository '[email protected]/group/repo.git' is shallow
.--depth 1
?