Come completare un clone git per un grande progetto su una connessione instabile?


193

Sto cercando di clonare gb il codebase di LibreOffice, ma al momento ho una connessione internet di circa 300kbps ed è praticamente tutt'altro che stabile. Riesco a recuperare la connessione in qualsiasi momento, ma poi il processo clone git ha già smesso di funzionare e non c'è modo di riavviarlo. Esiste un modo per scaricare un clone git più resistente agli errori?

Un'opzione che mi sono considerata è quella di scaricare la directory .git di qualcun altro, ma questo è eccessivamente dipendente dagli altri e non sembra la migliore soluzione possibile per me.


6
Devi clonare tutte le revisioni o solo le ultime? Forse depth -1è una soluzione?
Takeshin,

1
L'approccio bundle è già in atto per repository come kernel/git/torvalds/linux.git. E un clone git ripristinabile è in discussione (marzo 2016). Vedi stackoverflow.com/a/29192890/6309 .
VonC

Mi chiedo. Non lo fai git init, impostare un telecomando e poi fare il recupero fino a quando non riesce a fare il trucco? Non credo che il recupero scarti gli oggetti scaricati correttamente se la connessione fallisce.
Андрей Беньковский,

@ АндрейБеньковский qualcuno ha provato questo?
William Entriken,

Risposte:


71

Non credo sia ancora pronto. C'è una vecchia pagina GSoC che prevedeva di implementare la funzione desiderata. La mia scommessa migliore è, come hai suggerito, scaricarlo come directory. Suppongo che tu sia in grado di riprendere i download su altri protocolli.

Clone riavviabile

Quando si clona un repository di grandi dimensioni (come KDE, Open Office, kernel Linux) non è attualmente possibile riavviare un clone interrotto. Potrebbe essere necessario molto tempo prima che un utente alla fine di una piccola pipe scarichi i dati e se il clone viene interrotto nel mezzo, l'utente attualmente deve ricominciare dall'inizio e riprovare. Per alcuni utenti ciò potrebbe rendere impossibile la clonazione di un repository di grandi dimensioni.

Obiettivo: consentire a git-clone di riprendere automaticamente un download precedentemente fallito tramite il protocollo nativo git: //. Lingua: C Mentore: Shawn Pearce Suggerito da: Shawn Pearce su gmane


Aggiornare

Insieme al git clone --depth=1suggerimento di clonazione superficiale ( ) in una delle altre risposte, può essere utile se qualcuno può creare un repository nudo per te se è possibile comunicare con il provider. È possibile convertire facilmente il repository nudo in un repository completo. Leggi anche i commenti in quella risposta come un clone superficiale potrebbe non sempre aiutare.


Grazie per le informazioni, quindi il mio problema è noto e una soluzione è stata elaborata ... Cosa consiglieresti di aggirare?
LaPingvino,

9
Beh, proprio ieri, ho perso le mie 600 rupie ($ 10) a causa di questo problema. La larghezza di banda Internet è una cosa abbastanza preziosa nella mia parte del mondo.
Amit Singh Tomar,

2
Molte persone chiedono aggiornamenti e nessuno condivide il proprio contributo alla soluzione.
William Entriken,

2
Mar'18 - Lukin per ancora ... su questa terra !!
terrestre

3
11 anni dopo, l'attacco di Google alla questione socioeconomica di fondo della larghezza di banda inaffidabile con Google Fiber e Google Fi ha avuto risultati contrastanti. Le sue micro trincee di fibra nella città di Louisville furono tagliate troppo superficialmente nell'asfalto e i cavi furono trovati spuntare fuori dal fondo stradale subito dopo il lavoro. Nel frattempo, --depth 1e --unshallowsembra aver resistito agli anni di utilizzo.
rwong

126

Due soluzioni (o meglio soluzioni alternative ) che vengono in mente sono:

  • Usa un clone superficialegit clone --depth=1 , ad esempio , quindi approfondisci questo clone usandogit fetch --depth=N , con l'aumento della N . È possibile utilizzare git fetch --unshallow(dal 1.8.0.3) per scaricare tutte le revisioni rimanenti.

  • Chiedi a qualcuno di raggruppare alcune versioni taggate (vedi la manpage git-bundle (1) ). Il bundle stesso è un file ordinario, che puoi scaricare in qualsiasi modo, tramite HTTP / FTP con supporto per il ripristino, tramite BitTorrent, tramite rsync, ecc. Puoi creare cloni dal bundle, correggere la configurazione ed eseguire ulteriori recuperi dal repository ufficiale di LibreOffice .


3
Il trucco del clone superficiale non funziona bene in pratica. La clonazione di un repository ben confezionato (git: //libvirt.org/libvirt.git) trasforma un trasferimento 68M in un trasferimento 61M + 35M. Una caratteristica per dare priorità al gruppo di lavoro, piuttosto che a tutti i rami in profondità 1, potrebbe andare meglio; la ripresa della sessione sarebbe ancora meglio.
Tobu

1
@Tobu: il trucco del clone superficiale potrebbe funzionare in un repository con la storia di LonG. Sono in corso lavori per fare in modo che il clone superficiale ottenga solo un singolo ramo per impostazione predefinita. Ciò avrebbe potuto aiutare. O no.
Jakub Narębski,

6
Ora funziona davvero bene , con git 1.7.10. La profondità iniziale = 1 clone del repository Git è solo 4,72 Mb, mentre l'intero repository è 55 Mb. Ulteriori recuperi possono essere piccoli quanto vuoi, (profondità = 100 mi ha dato un fetche di ~ 20Mb). Il download totale compresso è stato di 31 Mb, oltre un clone e 3 recuperi.
nulla101

2
@ naught101 Scarica oggetti per una revisione e se il codice sorgente stesso è grande (non cronologia), allora sarà di nuovo un problema ...
kan

1
for m in $(seq 1 50);do git fetch --depth=$[m*100];doneha funzionato per me, grazie! :)
Trass3r

15

Questo metodo utilizza server di terze parti.

Prima di tutto, git clone --bareallora rsync -v -P -e ssh user@host:repo.git . puoi usare msys su Windows.


Ho provato l'opzione --bare, ha creato il contenuto previsto dei file interni .git all'interno di repo.git, ho dovuto fare il file clone git: ///path/to/repo.git/ per ottenere il repository effettivo
PiyusG

1
Linus non possiede GitHub ... per "server di terze parti", intendevi davvero "server Git che non mette in galera i suoi utenti così pesantemente da vietarne l'uso rsync(1) dal modo in cui GitHub ti sta guardando "? Oppure, vuoi dire prima git clone su un server di terze parti e poi risincronizzarlo sul computer locale?
JamesTheAwesomeDude,


9

Puoi "scaricare la directory .git di qualcun altro", ma con qualcun altro che è il repository ufficiale stesso. I repository di LibreOffice sono disponibili tramite http, ad esempio il loro build.gitè su http://anongit.freedesktop.org/git/libreoffice/build.git/ (vedi http://cgit.freedesktop.org/libreoffice/ per l'elenco completo, l'URL http si trova nella parte inferiore della pagina di ciascun repository).

Quello che vedi in questi URL http non è altro che una .gitdirectory (in realtà un repository "nudo", che ha solo ciò che troverai nella .gitdirectory). È la stessa directory che dovrebbe leggere il server per il git://protocollo ( git daemon). Se si esegue una copia di queste directory con un downloader Web (ad esempiowget -m -np ), è possibile clonare dalla propria copia e funzionerà come se si fosse clonato direttamente dal repository http.

Quindi, quello che puoi fare è: per ogni repository, procuratene una copia con il tuo downloader Web preferito (che affronterà tutti i problemi con la ripresa dei download interrotti) e clona da quella copia. Quando si desidera aggiornare, utilizzare nuovamente il downloader Web preferito per aggiornare la propria copia ed estrarre da quella copia. Ora i tuoi cloni e gli aggiornamenti sono resistenti alle cattive connessioni come il tuo downloader web preferito.


Hanno fatto la conversione in un solo repository ora, provando il tuo consiglio wget decide di scaricare il sito in una volta comunque ... (riprovando ora, probabilmente aggiornerò qui più tardi ...)
LaPingvino

Il tuo comando sembra ottenere tutti i collegamenti sul sito, il che non è ciò che dovrebbe accadere. Ho fatto ricorso a scrivere una sceneggiatura che sembra funzionare qui: gist.github.com/1307703 Comunque, grazie mille per l'idea iniziale!
LaPingvino,

Idea interessante, sto cercando di ottenere il repository ruby ​​/ ruby ​​da github e sto venendo bloccato da robots.txt ... qualche suggerimento?
hanetzer

6

Analizziamo le git clonesue parti componenti e usiamole git checkoutper impedire il ri-download dei file.

Quando git cloneviene eseguito, le prime cose che fa sono equivalenti

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

Se si eseguono i passaggi precedenti manualmente e si presuppone che siano stati completati correttamente, è ora possibile eseguire quanto segue tutte le volte necessarie:

git checkout --force <branch>

Nota che eseguirà il checkout di tutti i file ogni volta che viene eseguito, ma non dovrai scaricare di nuovo i file , il che potrebbe farti risparmiare un sacco di tempo.


1
non funziona come descritto, non consentirà di eseguire un reset git dopo un recupero interrotto
MaikoID

Come ho detto, una volta che si presume che un recupero sia stato completato correttamente, è possibile eseguire git reset. Se il recupero è interrotto, il ripristino non funzionerà. È necessario A) provare più volte a recuperare nuovamente fino a quando non funziona, oppure B) abbandonarlo e provare qualcos'altro.
cowlinator l'

Ho fatto qualcos'altro. Miracolosamente ha funzionato. Ho fatto un pull git invece di git fetch =)
MaikoID

@MaikoID Credo che un git pull stia semplicemente chiamando git fetch internamente, quindi si fonde, quindi il comando dovrebbe aver fatto la differenza
lucidbrot,

4

Se si ha accesso a un server di terze parti, è possibile clonare lì e quindi copiare.


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

Questo comando mi aiuta (grazie a Nicola Paolucci )

per esempio

git clone --depth 1 https://github.com/gokhanmoral/siyahkernel3 --branch ics  --single-branch

4

Basandosi sulle risposte basate su clone / profondità - alcune righe di bash lo fanno facilmente ...

git clone --depth=1 something@somegit.com:/var/git/whatever.git <directory> cd <directory> for m in `seq 1 100`;do git fetch --depth=$m;done


Grazie, sembra funzionare, sto provando a clonare l'Arduino, era al 25% con circa 800 MB e si è schiantato. il download in alcune parti sembra essere più sicuro, ma potrebbe non essere necessario eseguire i passaggi 1, forse 10 o 50 è meglio, a seconda di come viene aggiornato, immagina 80 mila file, non dovrebbe essere scritto in così poche profondità. Usando: for m in seq 1 10 1000; do git pull --depth = $ m; fatto per ottenere passaggi di 10. PS Se faccio Ctrl + CI perdo solo il pacchetto corrente e posso ricominciare da capo
user3394963

3

Anche questo problema mi ha morso. Nel mio caso c'è una soluzione. Potrebbe o meno essere applicabile nel tuo caso.

A volte utilizzo un telefono cellulare per avviare operazioni git su un sistema remoto. Se il mio wi-fi si interrompe, naturalmente, la sessione termina e git interrompe l'intera operazione di clone senza ripristinarsi. Ma poiché la connessione Internet dal mio sistema remoto al master git è solida, non è necessario arrestare il clone. Tutto ciò di cui ho bisogno è il buon senso per staccare il clone dalla sessione terminale. Questo può essere fatto usando screen / tmux o nohup / daemon. Quindi nel mio caso si tratta di un malfunzionamento del liveware.



2

Utilizzare CNTRL Z per interrompere la clonazione. Non chiudere il terminale mettere il sistema / laptop in modalità di ibernazione e continuare successivamente con il comando fg. Oggi stavo affrontando lo stesso problema mentre cercavo di clonare un repo da Github. Questo è stato per me un risparmio di tempo.


2

L'aumento della dimensione del buffer ti aiuterà in questo problema. Segui i passaggi.

passaggi:

1. Apri il terminale o Git Bash e con "cd" vai nella posizione in cui desideri clonare il repository.

2.Impostare la compressione su 0

git config --global core.compression 0

3.Impostare le dimensioni di PostBuffer

git config --global http.postBuffer 1048576000

4.Impostare la dimensione maxRequestBuffer

git config --global http.maxRequestBuffer 100M

5.Ora avvia il clone

git clone <repo url>

6. Attendere il completamento del clone.

Grazie. Buona programmazione !!!


Questa dovrebbe essere sicuramente la risposta accettata. Risolve il problema.
SuperEye il

1

Vorrei mettere qui i miei 5 centesimi. Questo è ciò che mi ha aiutato a risolvere questo problema

  • disattiva la compressione
  • aumentare http.postBuffer
  • fare un clone parziale
  • passare alla directory clonata e recuperare il resto del clone
  • tirare il resto
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

Questo mi ha aiutato a clonare un repository di ~ 3 GB sulla connessione adsl a 8 Mbps, ovviamente ho dovuto eseguire il recupero e il pull alcune volte, ma comunque ...


0

se supponiamo che i server abbiano una buona banda (e tu abbia un server) un'altra risposta è:

  1. creare il proprio server utilizzando lato server Git Wrapper 's
  2. clonalo nel tuo server
  3. Zip utilizzando Server-Side Zip Archiver s'
  4. scaricarlo da e con Server-Side supporto per la ripresa del

ma questo funziona solo con un'esperienza di sviluppo Web di base;) e anche di cui hai bisogno git.exenel tuo server


0

Stesso problema qui - Ho una connessione Internet davvero traballante con spesso non più di 10-15 kb / sec :-P

Per me il modo wget ha funzionato molto bene. Vai al sito del repository in cui si trova il pulsante verde "clona o scarica", fai clic e copia il collegamento dell'opzione di download ZIP.

Quindi inserire il collegamento al comando
wget : wget -c -m -np https://github.com/your/repository/archive/master.zip

Funziona come un fascino ...


0

la migliore soluzione alternativa che ha funzionato per me:

ho riscontrato lo stesso problema con una cattiva connessione a Internet. Quindi ho trovato la seguente soluzione:

Creato un piccolo file php sul mio server per scaricare il pacchetto come file 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>

quindi scaricare il file zip utilizzando qualsiasi download manager che supporti il ​​ripristino


-1

Puoi provare a usare mercurial con l'estensione hg-git.

Se il git fetch <commit-id>problema persiste, è possibile utilizzare per recuperare solo parti di un repository git remoto (è possibile recuperare un repository git vuoto, non è necessario crearlo con il clone). Ma potresti correggere la configurazione della diramazione (= creare diramazioni di localizzazione locali e remote) quando usi questo approccio.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.