web-dev-qa-db-fra.com

Comment compléter un clone git pour un gros projet sur une connexion instable?

J'essaie de cloner le code source de LibreOffice, mais pour le moment, je dispose d'une connexion Internet d'environ 300 kbps et elle 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 il est impossible de le relancer. Existe-t-il un moyen de télécharger un clone git plus résistant aux pannes?

Une option que je me suis 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.

168
LaPingvino

Je ne pense pas que ce soit prêt pour le moment. Il y a une ancienne page GSoC celle qui prévoyait de mettre en œuvre la fonctionnalité souhaitée. Mon meilleur pari est, comme vous l'avez suggéré, de le télécharger sous forme de répertoire. Je suppose que vous pouvez reprendre les téléchargements via d’autres protocoles.

Clone redémarrable

Lors du clonage d'un grand référentiel (tel que Comme KDE, Open Office, noyau Linux) il n'y a actuellement aucun moyen de redémarrer un clone interrompu. Il peut prendre temps considérable pour un utilisateur sur le fin d’un petit tuyau pour télécharger le données, et si le clone est interrompu au milieu l'utilisateur a actuellement besoin de recommencer depuis le début et réessayer. Pour certains utilisateurs, cela peut rendre impossible de cloner un grand dépôt.

Objectif: permettre à git-clone d’être automatiquement reprendre un téléchargement précédemment échoué sur le git natif: // protocole . Langue: C Mentor: Shawn Pearce Proposé par: Shawn Pearce sur gmane


Mettre à jour

En plus de la suggestion de clonage superficiel (git clone --depth=1) 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 de cette réponse, car un clone superficiel ne vous aidera pas toujours.

63
Jungle Hunter

Deux solutions (ou plutôt solutions de contournement) qui me viennent à l’esprit sont:

  • Utilisez shallow clone c'est-à-dire git clone --depth=1, puis deepen ce clone à l'aide de git fetch --depth=N, avec l'augmentation de N. 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 bundle jusqu'à une version étiquetée (voir git-bundle (1) man page). Le paquet lui-même est un fichier ordinaire, que vous pouvez télécharger comme vous le souhaitez, via HTTP/FTP avec support de CV, via BitTorrent, via rsync, etc. .

107
Jakub Narębski

Cette méthode utilise un serveur tiers. 

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

11
Rafal Rusin

Vous pouvez "télécharger le répertoire .git de quelqu'un d'autre", mais ce dernier est le dépôt officiel lui-même. Les référentiels LibreOffice sont disponibles via http. Par exemple, leur build.git se trouve à 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 à ces URL http n'est rien d'autre qu'un répertoire .git (en réalité un référentiel "nu", qui ne contient que ce que vous trouverez dans le répertoire .git). C'est le même répertoire que le serveur pour le protocole git:// (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.

Vous pouvez donc obtenir une copie de chaque référentiel avec votre téléchargeur Web préféré (qui traitera de tous les problèmes liés à la reprise de téléchargements interrompus) et cloner à 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-vous de cette copie. Désormais, vos clones et vos mises à jour sont aussi résistants aux mauvaises connexions que votre téléchargeur Web préféré.

9
CesarB

" Ne sous-estimez jamais la bande passante d'un pigeon voyageur et d'un paquet de cartes SD " serait la forme moderne de cette réponse. Tar it up, tout à fait vieux cp -a, peu importe, et postez cette fichue chose. Trouvez une personne disposée à prendre deux minutes de son temps pour déposer une clé USB dans un SASE. Trouvez un contact, là-bas, ils pourraient même le faire pour vous.

8
jthill

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

4
Amber
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
3
Ahed Eid

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

J'utilise parfois un téléphone portable pour lancer des opérations git sur un système distant. Bien sûr, si ma connexion Wi-Fi est interrompue, la session se termine et git abandonne toute l'opération de clone sans récupération. Mais comme la connexion Internet de mon système distant au git master est solide, il n’est pas nécessaire que le clone s’arrête. Tout ce dont j'ai besoin, c'est du bon sens pour détacher le clone de la session de terminal. Cela peut être fait en utilisant screen/tmux ou Nohup/daemon. C'est donc un dysfonctionnement du logiciel live dans mon cas.

3
Tony Sidaway

Décomposons git clone en ses composants et utilisons git reset pour éviter de télécharger à nouveau des fichiers.

Quand git clone est lancé, les premières choses qu’il fait équivalent à 

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 soient déroulées correctement, vous pouvez désormais exécuter les opérations suivantes autant de fois que nécessaire:

git checkout --force <branch>

Notez que tous les fichiers seront extraits à chaque exécution, mais vous ne devrez pas télécharger à nouveau les fichiers}, ce qui vous permettra peut-être de gagner beaucoup de temps.

3
cowlinator

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

2
Jicksy John

Construire sur les réponses basées sur le clone/la profondeur - quelques lignes de bash le font 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

1
Stephen

Utilisez un proxy git, tel que ngitcached ou git-proxy .

1
Amr Mostafa

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

j'ai fait face au même problème avec une mauvaise connexion Internet. Alors je suis venu avec la solution suivante:

Créé un petit fichier php sur mon serveur pour télécharger le paquet en 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 en utilisant n’importe quel gestionnaire de téléchargement prenant en charge la reprise

0
Zorox

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

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

0
Rudi

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

  • désactiver la compression
  • augmenter http.postBuffer
  • faire un clone 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 ~ 3Go repo sur la connexion adsl 8Mbps, bien sûr, je devais effectuer des extractions et des extractions plusieurs fois, mais toujours ...

0
matson kepson

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

  1. créez votre propre serveur avec Server-Side Git Wrapper '
  2. cloner sur votre serveur
  3. Zip avec Server-Side Zip Archiver '
  4. téléchargez-le depuis et avec Server-Side Reprendre le support

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

0
Top-Master

Même problème ici - j'ai une connexion Internet vraiment floconneuse avec souvent pas plus de 10-15 ko/sec :-P

Pour moi, la manière 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.

Ensuite, insérez le lien vers la commande wget:
wget -c -m -np https://github.com/your/repository/archive/master.Zip

Fonctionne comme un charme ...

0
X-File