Wie vervollständige ich einen Git-Klon für ein großes Projekt auf einer instabilen Verbindung?


193

Ich versuche, die LibreOffice-Codebasis zu klonen, aber im Moment habe ich eine Internetverbindung von ungefähr 300 KBit / s und sie ist einfach alles andere als stabil. Ich kann die Verbindung jederzeit wieder herstellen, aber dann funktioniert der Git-Klon-Prozess bereits nicht mehr und kann nicht mehr ausgeführt werden. Gibt es eine Möglichkeit, einen ausfallsichereren Git-Klon herunterzuladen?

Eine Option, die ich mir überlegt habe, ist das Herunterladen des .git-Verzeichnisses eines anderen, aber das hängt stark von anderen ab und scheint mir nicht die bestmögliche Lösung zu sein.


6
Müssen Sie alle oder nur die neuesten Revisionen klonen? Vielleicht depth -1ist eine Lösung?
Takeshin

1
Der Bundle-Ansatz ist für Repos wie bereits vorhanden kernel/git/torvalds/linux.git. Und ein wiederaufnehmbarer Git-Klon wird diskutiert (März 2016). Siehe stackoverflow.com/a/29192890/6309 .
VonC

Ich wundere mich. Wird es nicht git initgelingen, eine Fernbedienung einzustellen und dann abzurufen, bis der Trick erfolgreich ist? Ich glaube nicht, dass Abruf erfolgreich heruntergeladene Objekte verwirft, wenn die Verbindung fehlschlägt.
21ндрей Беньковский

@ АндрейБеньковский hat jemand dies versucht?
William Entriken

Antworten:


71

Ich denke das ist noch nicht fertig. Es gibt eine alte GSoC-Seite , auf der die gewünschte Funktion implementiert werden soll. Meine beste Wette ist, wie Sie vorgeschlagen haben, es als Verzeichnis herunterzuladen. Ich gehe davon aus, dass Sie Downloads über andere Protokolle fortsetzen können.

Neustartbarer Klon

Beim Klonen eines großen Repositorys (wie KDE, Open Office, Linux-Kernel) gibt es derzeit keine Möglichkeit, einen unterbrochenen Klon neu zu starten. Es kann einige Zeit dauern, bis ein Benutzer am Ende einer kleinen Pipe die Daten heruntergeladen hat. Wenn der Klon in der Mitte unterbrochen wird, muss der Benutzer derzeit von vorne beginnen und es erneut versuchen. Für einige Benutzer kann dies das Klonen eines großen Repositorys unmöglich machen.

Ziel: Ermöglichen Sie git-clone, einen zuvor fehlgeschlagenen Download über das native git: // -Protokoll automatisch fortzusetzen. Sprache: C Mentor: Shawn Pearce Vorgeschlagen von: Shawn Pearce auf Gmane


Aktualisieren

Zusammen mit dem git clone --depth=1Vorschlag für das flache Klonen ( ) in einer der anderen Antworten kann es hilfreich sein, wenn jemand ein nacktes Repository für Sie erstellen kann, wenn Sie mit dem Anbieter kommunizieren können. Sie können das nackte Repository problemlos in ein vollständiges Repository konvertieren . Lesen Sie auch die Kommentare in dieser Antwort, da ein flacher Klon möglicherweise nicht immer hilft.


Vielen Dank für die Informationen, damit mein Problem bekannt ist und an einer Lösung gearbeitet wird ... Was würden Sie als Workaround empfehlen?
LaPingvino

9
Nun, erst gestern habe ich meine 600 Rupien (10 US-Dollar) wegen dieses Problems verloren. Die Internet-Bandbreite ist in meinem Teil der Welt eine ziemlich wertvolle Sache.
Amit Singh Tomar

2
Viele Leute fragen nach Updates und niemand teilt ihren Beitrag zur Lösung.
William Entriken

2
Mar'18 - lukin dafür noch ... auf dieser Erde !!
Erdling

3
11 Jahre später hatte Googles Angriff auf das zugrunde liegende sozioökonomische Problem der unzuverlässigen Bandbreite mit Google Fibre und Google Fi gemischte Ergebnisse. Die Fasermikrogräben in der Stadt Louisville wurden zu flach in den Asphalt geschnitten , und die Kabel ragten kurz nach der Arbeit aus der Straßenoberfläche heraus. Inzwischen --depth 1und --unshallowscheint den Jahren der Nutzung standgehalten zu haben.
Rwong

126

Zwei Lösungen (oder besser gesagt Problemumgehungen ), die mir in den Sinn kommen, sind:

  • Verwendung flache Klon dh git clone --depth=1, dann vertieft dieser Klon mit git fetch --depth=N, mit zunehmendem N . Sie können git fetch --unshallow(seit 1.8.0.3) verwenden, um alle verbleibenden Revisionen herunterzuladen.

  • Bitten Sie jemanden, bis zu einer getaggten Version zu bündeln (siehe Manpage zu git-bundle (1) ). Das Bundle selbst ist eine gewöhnliche Datei, die Sie auf beliebige Weise über HTTP / FTP mit Unterstützung für Lebensläufe, über BitTorrent, über rsync usw. herunterladen können. Sie können einen Klon aus dem Bundle erstellen, die Konfiguration korrigieren und weitere Abrufe aus dem offiziellen LibreOffice-Repository durchführen .


3
Der flache Klon-Trick funktioniert in der Praxis nicht gut. Das Klonen eines gut gepackten Repos (git: //libvirt.org/libvirt.git) ändert eine 68M-Übertragung in eine 61M + 35M-Übertragung. Eine Funktion zum Priorisieren des Arbeitsbaums anstelle aller Zweige in Tiefe 1 könnte besser abschneiden. Die Wiederaufnahme der Sitzung wäre noch besser.
Tobu

1
@Tobu: Ein Trick mit flachem Klon funktioniert möglicherweise in einem Repository mit langem Verlauf. Es wird derzeit daran gearbeitet, dass flache Klone standardmäßig nur einen einzigen Zweig erhalten. Das hätte vielleicht geholfen. Oder nicht.
Jakub Narębski

6
Dies funktioniert jetzt sehr gut mit Git 1.7.10. Die anfängliche Tiefe = 1 Klon des Git-Repositorys beträgt nur 4,72 MB, während das gesamte Repository 55 MB beträgt. Weitere Abrufe können so klein sein, wie Sie möchten (Tiefe = 100 gab mir einen Abruf von ~ 20 MB). Der gesamte komprimierte Download betrug 31 MB, über einen Klon und 3 Abrufe.
naught101

2
@ naught101 Es lädt Objekte für eine Revision herunter, und wenn der Quellcode selbst groß ist (nicht Verlauf), dann wird es wieder ein Problem sein ...
kan

1
for m in $(seq 1 50);do git fetch --depth=$[m*100];donehat für mich gearbeitet, danke! :)
Trass3r

15

Diese Methode verwendet Server von Drittanbietern.

Zuerst tun git clone --bare, dann können rsync -v -P -e ssh user@host:repo.git . Sie msys unter Windows verwenden.


Ich habe die Option --bare ausprobiert. Sie hat den erwarteten Inhalt der internen .git-Dateien in repo.git erstellt. Ich musste die git-Klondatei ausführen: ///path/to/repo.git/, um das eigentliche Repository zu erhalten
PiyusG

1
Linus besitzt GitHub nicht ... mit "Drittanbieter-Server", meinten Sie eigentlich "Git-Server, der seine Benutzer nicht so stark einsperrt, dass ihre Verwendung von rsync(1) GitHub, wie ich Sie sehe , verboten wird "? Oder meinst du zum ersten git clone auf einem 3rd-Party - Server und rsync es dann auf dem lokalen Rechner?
JamesTheAwesomeDude


9

Sie können "das .git-Verzeichnis einer anderen Person herunterladen", wobei diese andere Person das offizielle Repository selbst ist. Die LibreOffice-Repositorys sind über http verfügbar. Sie finden sie beispielsweise build.gitunter http://anongit.freedesktop.org/git/libreoffice/build.git/ (eine vollständige Liste finden Sie unter http://cgit.freedesktop.org/libreoffice/) . Die http-URL befindet sich unten auf der Seite jedes Repositorys.

Was Sie unter diesen http-URLs sehen, ist nichts anderes als ein .gitVerzeichnis (eigentlich ein "nacktes" Repository, das nur das enthält, was Sie im .gitVerzeichnis finden würden ). Es ist dasselbe Verzeichnis, das der Server für das git://Protokoll ( git daemon) lesen würde. Wenn Sie eine Kopie dieser Verzeichnisse (z. B. wget -m -np) mit einem Web-Downloader erstellen , können Sie von Ihrer Kopie klonen. Dies funktioniert genauso gut, als ob Sie direkt aus dem http-Repository geklont hätten.

Sie können also Folgendes tun: Holen Sie sich für jedes Repository eine Kopie davon mit Ihrem bevorzugten Web-Downloader (der alle Probleme bei der Wiederaufnahme fehlerhafter Downloads behandelt) und klonen Sie von dieser Kopie. Wenn Sie aktualisieren möchten, verwenden Sie erneut Ihren bevorzugten Web-Downloader, um Ihre Kopie zu aktualisieren, und ziehen Sie von dieser Kopie ab. Jetzt sind Ihre Klone und Updates genauso widerstandsfähig gegen schlechte Verbindungen wie Ihr bevorzugter Web-Downloader.


Sie haben die Konvertierung jetzt in nur ein Repository vorgenommen und versuchen, Ihren Tipp zu erhalten. Wget beschließt jedoch, die Site sofort herunterzuladen ... (versuchen Sie es jetzt erneut, wird wahrscheinlich später hier aktualisiert ...)
LaPingvino

Ihr Befehl scheint alle Links auf der Site zu erhalten, was nicht beabsichtigt ist. Ich habe ein Skript geschrieben, das hier zu funktionieren scheint: gist.github.com/1307703 Wie auch immer, vielen Dank für die erste Idee!
LaPingvino

Interessante Idee, ich versuche das Ruby / Ruby Repo von Github zu bekommen und werde von der robots.txt blockiert ... irgendwelche Vorschläge?
Hanetzer

6

Lassen Sie git cloneuns in seine Bestandteile zerlegen und git checkoutverhindern, dass Dateien erneut heruntergeladen werden.

Wenn es ausgeführt wird git clone, sind die ersten Dinge, die es tut, gleichbedeutend mit

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

Wenn Sie die obigen Schritte manuell ausführen und davon ausgehen, dass sie korrekt ausgeführt wurden, können Sie jetzt die folgenden Schritte so oft wie nötig ausführen:

git checkout --force <branch>

Beachten Sie, dass bei jeder Ausführung alle Dateien ausgecheckt werden, Sie jedoch keine Dateien erneut herunterladen müssen , wodurch Sie möglicherweise eine Menge Zeit sparen.


1
Es funktioniert nicht so, wie Sie es beschreiben. Es erlaubt keinen Git-Reset nach einem
fehlerhaften

Wie gesagt, sobald Sie davon ausgehen, dass ein Abruf erfolgreich abgeschlossen wurde, können Sie git reset ausführen. Wenn Ihr Abruf unterbrochen ist, funktioniert das Zurücksetzen nicht. Sie müssen entweder A) wiederholt versuchen, erneut abzurufen, bis es funktioniert, oder B) dies abbrechen und etwas anderes versuchen.
Cowlinator

Ich habe etwas anderes gemacht, es hat auf wundersame Weise funktioniert. Ich habe einen Git Pull statt Git Fetch gemacht =)
MaikoID

@ MaikoID Ich glaube, ein Git Pull zieht nur Git Fetch intern auf und führt dann zusammen, also hätte der Befehl ned den Unterschied machen sollen
lucidbrot

4

Wenn Sie Zugriff auf einen Server eines Drittanbieters haben, können Sie dort klonen und dann kopieren.


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

Dieser Befehl hilft mir (Danke an Nicola Paolucci )

beispielsweise

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

4

Aufbauend auf den klon- / tiefenbasierten Antworten - ein paar Zeilen Bash erledigen dies ganz einfach ...

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


Danke, es scheint zu funktionieren, ich versuche das Arduino zu klonen, es lag bei 25% mit ungefähr 800 MB und es stürzte ab. Das Herunterladen in Teilen scheint sicherer zu sein, muss aber möglicherweise nicht in Schritten von 1 erfolgen. Vielleicht sind 10 oder 50 besser, je nachdem, wie es aktualisiert wird. Stellen Sie sich vor, 80.000 Dateien sollten nicht in so wenigen Tiefen geschrieben werden. Verwenden von: für m in seq 1 10 1000; do git pull --depth = $ m; erledigt, um Schritte von 10 zu erhalten. PS Wenn ich Strg + CI mache, verliere ich nur das aktuelle Paket und ich kann von
vorne

3

Dieses Problem hat mich auch gebissen. In meinem Fall gibt es eine Umgehung. Es kann in Ihrem Fall zutreffen oder nicht.

Ich benutze manchmal ein Mobiltelefon, um Git-Operationen auf einem Remote-System zu initiieren. Wenn mein Wi-Fi natürlich kaputt geht, endet die Sitzung und Git lässt den gesamten Klonvorgang fallen, ohne sich zu erholen. Da die Internetverbindung von meinem Remote-System zum Git-Master solide ist, muss der Klon nicht gestoppt werden. Ich brauche nur den gesunden Menschenverstand, um den Klon von der Terminalsitzung zu trennen. Dies kann mit screen / tmux oder nohup / daemon erfolgen. In meinem Fall handelt es sich also um eine Liveware-Fehlfunktion.



2

Verwenden Sie CNTRL Z, um das Klonen zu stoppen. Schließen Sie das Terminal nicht und versetzen Sie das System / den Laptop in den Ruhezustand. Fahren Sie später mit dem Befehl fg fort. Ich hatte heute das gleiche Problem, als ich versuchte, ein Repo von Github zu klonen. Dies war eine Zeitersparnis für mich.


1

Ich möchte meine 5 Cent hier setzen. Dies hat mir tatsächlich geholfen, dieses Problem zu lösen

  • Komprimierung ausschalten
  • Erhöhen Sie http.postBuffer
  • mache einen Teilklon
  • Navigieren Sie zum geklonten Verzeichnis und rufen Sie den Rest des Klons ab
  • zieh den Rest
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

Dies half mir, ~ 3 GB Repo über die 8-Mbit / s-ADSL-Verbindung zu klonen. Natürlich musste ich einige Male Abrufen und Ziehen durchführen, aber immer noch ...


1

Das Erhöhen der Puffergröße hilft Ihnen bei diesem Problem. Folgen Sie einfach den Schritten.

Schritte:

1. Öffnen Sie das Terminal oder Git Bash und gehen Sie mit "cd" zu dem Ort, an dem Sie das Repo klonen möchten.

2.Stellen Sie die Komprimierung auf 0

git config --global core.compression 0

3.Stellen Sie die PostBuffer-Größe ein

git config --global http.postBuffer 1048576000

4.Stellen Sie die maxRequestBuffer-Größe ein

git config --global http.maxRequestBuffer 100M

5. Starten Sie jetzt den Klon

git clone <repo url>

6.Warten Sie, bis der Klon vollständig ist.

Danke dir. Viel Spaß beim Codieren !!!


0

Wenn wir davon ausgehen, dass Server bandweit gut sind (und Sie einen Server haben), lautet eine andere Antwort:

  1. Erstellen Sie Ihren eigenen Server Side mit Git Wrapper ‚s
  2. Klonen Sie es auf Ihrem Server
  3. Zip it mit Server-Side Zip Archiver s‘
  4. Laden Sie es von und mit Unterstützung für serverseitige Lebensläufe herunter

Dies funktioniert jedoch nur mit sehr grundlegenden Erfahrungen in der Webentwicklung;) und Sie benötigen auch git.exein Ihrem Server


0

Gleiches Problem hier - Ich habe eine wirklich flockige Internetverbindung mit oft nicht mehr als 10-15 kb / s :-P

Für mich hat der Wget-Weg sehr gut funktioniert. Gehen Sie zu der Repository-Site, auf der sich die grüne Schaltfläche "Klonen oder Herunterladen" befindet, klicken Sie darauf und kopieren Sie den Link der ZIP-Download-Option.


Fügen Sie dann den Link zum Befehl wget ein : wget -c -m -np https://github.com/your/repository/archive/master.zip

Klappt wunderbar...


0

Die beste Problemumgehung, die für mich funktioniert hat:

Ich hatte das gleiche Problem mit einer schlechten Internetverbindung. Also habe ich mir folgende Lösung ausgedacht:

Erstellt eine kleine PHP-Datei auf meinem Server, um das Paket als Zip-Datei herunterzuladen:

<?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>

Laden Sie dann die Zip-Datei mit einem beliebigen Download-Manager herunter, der den Lebenslauf unterstützt


-1

Sie können versuchen, mercurial mit der Erweiterung hg-git zu verwenden.

Wenn dies nicht funktioniert, können Sie git fetch <commit-id>nur Teile eines Remote-Git-Repositorys abrufen (Sie können in ein leeres Git-Repository abrufen, es muss nicht mit dem Klon erstellt werden). Sie können jedoch die Zweigstellenkonfiguration korrigieren (= lokale und Remote-Tracking-Zweige erstellen), wenn Sie diesen Ansatz verwenden.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.