Comment terminer un clone git pour un gros projet sur une connexion instable?

193

J'essaie de cloner la base de code LibreOffice, mais pour le moment, j'ai une connexion Internet d'environ 300 kbps et c'est tout sauf stable. Je peux récupérer la connexion à tout moment, mais le processus de clonage git a déjà cessé de fonctionner, et aucun moyen de le redémarrer. Existe-t-il un moyen d'avoir un téléchargement de clone git plus résistant aux pannes?

Une option que j'ai envisagée est de télécharger le répertoire .git de quelqu'un d'autre, mais cela dépend trop des autres et ne me semble pas être la meilleure solution possible.

LaPingvino
la source
6
Avez-vous besoin de cloner toutes les révisions ou simplement les dernières? Peut depth -1- être une solution?
prend
1
L'approche groupée est déjà en place pour les pensions comme kernel/git/torvalds/linux.git. Et un clone git pouvant être repris est en cours de discussion (mars 2016). Voir stackoverflow.com/a/29192890/6309 .
VonC
Je me demande. Ne pas faire git init, configurer une télécommande puis faire la récupération jusqu'à ce qu'elle réussisse faire l'affaire? Je ne pense pas que Fetch supprime les objets téléchargés avec succès si la connexion échoue.
Андрей Беньковский
@ АндрейБеньковский est-ce que quelqu'un a essayé ça?
William Entriken

Réponses:

71

Je ne pense pas que ce soit encore prêt. Il existe une ancienne page GSoC qui prévoyait d'implémenter la fonctionnalité souhaitée. Mon meilleur pari est, comme vous l'avez suggéré, de le télécharger en tant que répertoire. Je suppose que vous êtes en mesure de reprendre les téléchargements via d'autres protocoles.

Clone redémarrable

Lors du clonage d'un grand référentiel (tel que KDE, Open Office, noyau Linux), il n'y a actuellement aucun moyen de redémarrer un clone interrompu. Cela peut prendre un temps considérable pour un utilisateur à l'extrémité d'un petit tube pour télécharger les données, et si le clone est interrompu au milieu, l'utilisateur doit actuellement recommencer depuis le début et réessayer. Pour certains utilisateurs, cela peut rendre impossible le clonage d'un grand référentiel.

Objectif: permettre à git-clone de reprendre automatiquement un téléchargement ayant échoué précédemment via le protocole natif git: //. Langue: C Mentor: Shawn Pearce Suggéré par: Shawn Pearce sur gmane


Mettre à jour

En plus de la git clone --depth=1suggestion de clonage superficiel ( ) dans l'une des autres réponses, il peut être utile que quelqu'un puisse créer un référentiel nu pour vous si vous pouvez communiquer avec le fournisseur. Vous pouvez facilement convertir le référentiel nu en un référentiel complet. Lisez également les commentaires dans cette réponse car un clone superficiel peut ne pas toujours aider.

Chasseur de la jungle
la source
Merci pour l'information, donc mon problème est connu et une solution est travaillée ... Que recommanderiez-vous comme solution de contournement?
LaPingvino
9
Eh bien, hier, j'ai perdu mes 600 roupies (10 $) à cause de ce problème. La bande passante Internet est une chose assez précieuse dans ma partie du monde.
Amit Singh Tomar
2
Beaucoup de gens demandent des mises à jour et personne ne partage sa contribution à la solution.
William Entriken
2
Mar'18 - lukin pour ça encore ... sur cette terre !!
earthling
3
11 ans plus tard, l'attaque de Google sur le problème socio-économique sous-jacent de la bande passante non fiable avec Google Fiber et Google Fi a eu des résultats mitigés. Ses micro-tranchées en fibre dans la ville de Louisville ont été creusées trop peu profondément dans l'asphalte, et les câbles ont été retrouvés sortant de la chaussée peu après les travaux. Pendant ce temps, --depth 1et --unshallowsemble avoir résisté aux années d'utilisation.
rwong
126

Deux solutions (ou plutôt des contournements ) qui me viennent à l'esprit sont:

  • Utilisez un clone peu profondgit clone --depth=1 , c'est-à - dire , puis approfondissez ce clone en utilisant git fetch --depth=N, avec N croissante . Vous pouvez utiliser git fetch --unshallow(depuis la 1.8.0.3) pour télécharger toutes les révisions restantes.

  • Demandez à quelqu'un de regrouper une version balisée (voir la page de manuel git-bundle (1) ). Le bundle lui-même est un fichier ordinaire, que vous pouvez télécharger de n'importe quelle manière, via HTTP / FTP avec prise en charge de la reprise, via BitTorrent, via rsync, etc. .

Jakub Narębski
la source
3
L'astuce du clone peu profond ne fonctionne pas bien dans la pratique. Le clonage d'un dépôt bien rempli (git: //libvirt.org/libvirt.git) transforme un transfert de 68 Mo en un transfert de 61 millions + 35 millions d'euros. Une fonctionnalité permettant de prioriser l'arbre de travail, plutôt que toutes les branches à la profondeur 1, pourrait mieux fonctionner; la reprise de session serait mieux encore.
Tobu
1
@Tobu: L'astuce de clonage peu profond pourrait fonctionner dans un référentiel avec un historique lonG. Des travaux sont en cours pour que le clone peu profond n'obtienne qu'une seule branche par défaut. Cela aurait pu aider. Ou pas.
Jakub Narębski
6
Cela fonctionne vraiment bien maintenant, avec git 1.7.10. La profondeur initiale = 1 clone du référentiel Git n'est que de 4,72 Mo, tandis que l'ensemble du référentiel fait 55 Mo. D'autres récupérations peuvent être aussi petites que vous le souhaitez, (la profondeur = 100 m'a donné une récupération d'environ 20 Mo). Le téléchargement compressé total était de 31 Mo, sur un clone et 3 récupérations.
naught101
2
@ naught101 Il télécharge des objets pour une révision, et si le code source lui-même est volumineux (pas d'historique), alors ce sera à nouveau un problème ...
kan
1
for m in $(seq 1 50);do git fetch --depth=$[m*100];donetravaillé pour moi, merci! :)
Trass3r
15

Cette méthode utilise un serveur tiers.

Tout d'abord, faites-le git clone --bare, puis rsync -v -P -e ssh user@host:repo.git . Vous pouvez utiliser msys sous Windows.

Rafal Rusin
la source
J'ai essayé l'option --bare, elle a créé le contenu attendu des fichiers internes .git dans repo.git, j'ai dû faire le fichier git clone: ​​///path/to/repo.git/ pour obtenir le référentiel réel
PiyusG
1
Linus ne possède pas GitHub … par "serveur tiers", vouliez-vous dire "serveur Git qui n'emprisonne pas ses utilisateurs au point d'interdire leur utilisation de rsync(1) la façon dont GitHub je vous regarde "? Ou, voulez-vous d'abord git clone sur un serveur tiers, puis le resynchroniser sur la machine locale?
JamesTheAwesomeDude
9

Vous pouvez "télécharger le répertoire .git de quelqu'un d'autre", mais avec ce quelqu'un d'autre étant le dépôt officiel lui-même. Les référentiels LibreOffice sont disponibles via http, par exemple build.gitsur http://anongit.freedesktop.org/git/libreoffice/build.git/ (voir http://cgit.freedesktop.org/libreoffice/ pour la liste complète, l'URL http se trouve au bas de la page de chaque référentiel).

Ce que vous voyez sur ces URL http n'est rien de plus qu'un .gitrépertoire (en fait un référentiel "nu", qui n'a que ce que vous trouverez dans le .gitrépertoire). C'est le même répertoire que le serveur du git://protocole ( git daemon) lirait. Si vous faites une copie de ces répertoires avec un téléchargeur Web (par exemple wget -m -np), vous pouvez cloner à partir de votre copie et cela fonctionnera aussi bien que si vous aviez cloné directement à partir du référentiel http.

Donc, ce que vous pouvez faire est: pour chaque référentiel, obtenez-en une copie avec votre téléchargeur Web préféré (qui traitera tous les problèmes liés à la reprise des téléchargements interrompus), et clonez à partir de cette copie. Lorsque vous souhaitez mettre à jour, utilisez à nouveau votre téléchargeur Web préféré pour mettre à jour votre copie et extrayez-la. Désormais, vos clones et mises à jour résistent aussi bien aux mauvaises connexions que votre téléchargeur Web préféré.

CesarB
la source
Ils ont fait la conversion vers un seul référentiel maintenant, essayant votre astuce wget décide de télécharger le site à la fois cependant ... (réessayer maintenant, sera probablement mis à jour ici plus tard ...)
LaPingvino
Votre commande semble obtenir tous les liens sur le site, ce qui n'est pas ce qui est censé arriver. J'ai eu recours à l'écriture d'un script qui semble fonctionner ici: gist.github.com/1307703 Quoi qu'il en soit, merci beaucoup pour l'idée initiale!
LaPingvino
Idée intéressante, j'essaie d'obtenir le repo ruby ​​/ ruby ​​de github et je suis bloqué par le robots.txt ... des suggestions?
hanetzer
6

Décomposons ses git clonecomposants et utilisons git checkoutpour empêcher le re-téléchargement de fichiers.

Lorsqu'elle git clones'exécute, les premières opérations effectuées sont équivalentes à

git init
git remote add origin <repo_url>
git fetch origin <branch>

Si vous exécutez les étapes ci-dessus manuellement et en supposant qu'elles se sont déroulées correctement, vous pouvez maintenant exécuter les opérations suivantes autant de fois que nécessaire:

git checkout --force <branch>

Notez qu'il récupérera tous les fichiers à chaque exécution, mais vous n'aurez pas à retélécharger les fichiers , ce qui peut vous faire gagner beaucoup de temps.

cowlinator
la source
1
cela ne fonctionne pas comme vous le décrivez, cela ne permettra pas de réinitialiser git après une récupération interrompue
MaikoID
Comme je l'ai dit, une fois que vous supposez qu'une extraction s'est terminée avec succès, vous pouvez exécuter git reset. Si votre récupération est interrompue, la réinitialisation ne fonctionnera pas. Vous devez soit A) essayer de récupérer à plusieurs reprises jusqu'à ce que cela fonctionne, ou B) abandonner cela et essayer autre chose.
cowlinator
J'ai fait autre chose que j'ai miraculeux. J'ai fait un git pull au lieu de git fetch =)
MaikoID
@MaikoID Je crois qu'un git pull appelle simplement git fetch en interne, puis fusionne, donc la commande aurait dû faire la différence
lucidbrot
4

Si vous avez accès à un serveur tiers, vous pouvez le cloner puis copier.

ambre
la source
4
git clone --depth <Number> <repository> --branch <branch name> --single-branch

Cette commande m'aide (merci à Nicola Paolucci )

par exemple

git clone --depth 1 https://github.com/gokhanmoral/siyahkernel3 --branch ics  --single-branch
Ahed Eid
la source
4

S'appuyant sur les réponses basées sur le clone / profondeur - quelques lignes de bash permettent de le faire facilement ...

git clone --depth=1 [email protected]:/var/git/whatever.git <directory> cd <directory> for m in `seq 1 100`;do git fetch --depth=$m;done

Stephen
la source
Merci, cela semble fonctionner, j'essaye de cloner l'Arduino, c'était à 25% avec environ 800 Mo, et il s'est écrasé. le téléchargement par parties semble être plus sûr, mais peut ne pas être nécessaire par étapes de 1, peut-être 10 ou 50, c'est mieux, selon la façon dont il est mis à jour, imaginez 80000 fichiers, ne devrait pas être écrit dans si peu de profondeur. En utilisant: for m in seq 1 10 1000; do git pull --depth = $ m; done pour obtenir des étapes de 10. PS Si je fais Ctrl + CI, je perds uniquement le paquet actuel, et je peux recommencer
user3394963
3

Ce problème m'a mordu aussi. Dans mon cas, il y a une solution. Cela peut s'appliquer ou non dans votre cas.

J'utilise parfois un téléphone portable pour lancer des opérations git sur un système distant. Si mon wi-fi s'arrête bien sûr, la session se termine et git supprime toute l'opération de clonage sans récupérer. Mais comme la connexion Internet de mon système distant au maître git est solide, il n'est pas nécessaire que le clone s'arrête. Tout ce dont j'ai besoin est le bon sens pour détacher le clone de la session terminale. Cela peut être fait en utilisant screen / tmux ou nohup / daemon. C'est donc un dysfonctionnement du liveware dans mon cas.

Tony Sidaway
la source
2

Utilisez CNTRL Z pour arrêter le clonage. Ne fermez pas le terminal, mettez le système / ordinateur portable en veille prolongée, puis continuez plus tard par la commande fg. J'étais confronté au même problème aujourd'hui en essayant de cloner un repo frm github. Cela m'a permis de gagner du temps.

Jicksy John
la source
2

L'augmentation de la taille de la mémoire tampon vous aidera dans ce problème. Suivez simplement les étapes.

pas:

1.Ouvrez le terminal ou Git Bash et avec "cd" allez à l'emplacement où vous vouliez cloner le dépôt.

2.Réglez la compression à 0

git config --global core.compression 0

3. définir la taille du postBuffer

git config --global http.postBuffer 1048576000

4.Set maxRequestBuffer size

git config --global http.maxRequestBuffer 100M

5.Maintenant, commencez le clonage

git clone <repo url>

6.Attendez que le clone soit terminé.

Je vous remercie. Bon codage !!!

Swapnil Naukudkar
la source
Cela devrait certainement être la réponse acceptée. Cela résout le problème.
SuperEye
1

Je voudrais mettre mes 5 cents ici. C'est en fait ce qui m'a aidé à résoudre ce problème

  • désactiver la compression
  • augmenter http.postBuffer
  • faire un clonage partiel
  • accédez au répertoire cloné et récupérez le reste du clone
  • tire le reste
git config --global core.compression 0
git config --global https.postBuffer 524288000
git clone  <your_git_http_url_here> --depth 1
git fetch --unshallow 
git pull --all

Cela m'a aidé à cloner ~ 3 Go de repo sur la connexion adsl 8 Mbps, bien sûr, j'ai dû effectuer des récupérations et des extractions plusieurs fois, mais quand même ...

matson kepson
la source
0

si nous supposons que les serveurs ont une bonne bande passante (et que vous avez un serveur), une autre réponse est de:

  1. créer votre propre serveur en utilisant côté serveur Git Wrapper s »
  2. clonez-le sur votre serveur
  3. Zip à l'aide de côté serveur Zip Archiver s »
  4. téléchargez-le depuis et avec la prise en charge de la reprise côté serveur

mais cela ne fonctionne qu'avec une expérience de développement Web très basique;) et vous avez également besoin git.exedans votre serveur

Top maître
la source
0

Même problème ici - j'ai une connexion Internet très irrégulière avec souvent pas plus de 10-15 kb / s :-P

Pour moi, la méthode wget a très bien fonctionné. Allez sur le site du référentiel où se trouve le bouton vert "cloner ou télécharger", cliquez dessus et copiez le lien de l'option de téléchargement ZIP.

Insérez ensuite le lien vers la commande
wget : wget -c -m -np https://github.com/your/repository/archive/master.zip

Fonctionne comme un charme ...

X-File
la source
0

la meilleure solution de contournement qui a fonctionné pour moi:

J'ai rencontré le même problème avec une mauvaise connexion Internet. J'ai donc proposé la solution suivante:

J'ai créé un petit fichier php sur mon serveur pour télécharger le package sous forme de fichier zip:

<?php
$url = "https://codeload.github.com/CocoaPods/Specs/zip/master";
file_put_contents("coco.zip", fopen($url, 'r'));
?>  

<a href="coco.zip">coco.zip</a>

puis téléchargez le fichier zip à l'aide de n'importe quel gestionnaire de téléchargement prenant en charge la reprise

Zorox
la source
-1

Vous pouvez essayer d'utiliser mercurial avec l'extension hg-git.

Si cela ne fonctionne pas, vous pouvez utiliser git fetch <commit-id>pour récupérer uniquement des parties d'un référentiel git distant (vous pouvez récupérer un référentiel git vide, il n'est pas nécessaire de le créer avec clone). Mais vous pouvez corriger la configuration de la branche (= créer des branches de suivi locales et distantes) lorsque vous utilisez cette approche.

Rudi
la source