webentwicklung-frage-antwort-db.com.de

Effizientes Abrufen von Git aus einem flachen Klon

Wir verwenden git, um ein Betriebssystem zu verbreiten und auf dem neuesten Stand zu halten . Wir können das vollständige Repository nicht verteilen, da es zu groß ist (> 2 GB), daher haben wir flache Klone (~ 300 MB) verwendet. Allerdings kürzlich beim Abrufen von einem flachen Klon wurde das gesamte> 2 GB-Repository ineffizient abgerufen . Dies ist eine unhaltbare Verschwendung von Bandbreite für Bereitstellungen.

Die Git-Dokumentation besagt, dass Sie nicht aus einem flachen Repository abrufen können, obwohl dies absolut nicht der Fall ist. Gibt es Workarounds, um mit einem git clone --depth 1 Genau das abzurufen, was sich daran geändert hat? Oder eine andere Strategie, um die Verteilungsgröße so klein wie möglich zu halten , während alle Bits benötigt werden, um ein Update durchzuführen?

Ich habe erfolglos versucht, von --depth 20 Zu klonen, um zu sehen, ob es effizienter aktualisiert wird. Das hat nicht funktioniert. Ich habe mir auch http://git-scm.com/docs/git-bundle angesehen, aber das scheint riesige Bündel zu schaffen.

44
hendry

--depth Ist eine Option git fetch. Ich sehe, dass das Dokument nicht wirklich hervorhebt, dass git clone Einen Abruf ausführt.

Wenn Sie abrufen, tauschen die beiden Repos die Informationen darüber aus, wer was hat, indem sie von den Köpfen der Fernbedienung aus nach dem letzten geteilten Commit im Verlauf der abgerufenen Refs suchen und dann alle fehlenden Objekte ausfüllen, um nur die neuen Commits zwischen den zu vervollständigen Die letzten geteilten und die neu abgerufenen Commits.

Ein --depth=1 - Abruf ruft nur die Verzweigungstipps und keine Vorgeschichte ab. Bei weiteren Abrufen dieser Historien wird nach dem oben beschriebenen Verfahren alles Neue abgerufen. Wenn die zuvor abgerufenen Commits jedoch nicht in der neu abgerufenen Historie enthalten sind, werden beim Abrufen alle Daten abgerufen - es sei denn, Sie begrenzen den Abruf mit --depth. .

Ihr Kunde hat einen Depth = 1-Abruf von einem Repo durchgeführt und die URLs auf ein anderes Repo umgestellt. Mindestens ein langer Abstammungspfad in den Refs dieses neuen Repos teilt anscheinend keine Verpflichtungen mit etwas, das sich derzeit in Ihrem Repo befindet. Das ist vielleicht eine Untersuchung wert, aber so oder so können Ihre Kunden, es sei denn, es gibt einen bestimmten Grund, einfach jeden Abruf durchführen --depth=1.

37
jthill

Habe gerade g clone github.com:torvalds/linux Gemacht und es hat so viel Zeit gekostet, dass ich es einfach mit CTRL+C Übersprungen habe.

Dann tat g clone github.com:torvalds/linux --depth 1 Und es klonte ziemlich schnell. Und ich habe nur ein Commit in git log.

Also sollte clone --depth 1 Funktionieren. Wenn Sie das vorhandene Repository aktualisieren müssen, sollten Sie git fetch Origin branchname:branchname --depth 1 Verwenden. Es funktioniert auch, es wird nur ein Commit abgerufen.

Zusammenfassen:

Anfänglicher Klon:

git clone git_url --depth 1

Code-Update

git fetch Origin branch:branch --depth 1
26
Waterlink

Beachten Sie, dass Git 1.9/2.0 (Q1 2014) beim Abrufen eines flachen Klons effizienter sein kann.
Siehe commit 82fba2b , from Nguyễn Thái Ngọc Duy (pclouds) :

Da Git nun die Datenübertragung von oder zu einem flachen Klon unterstützt, gelten diese Einschränkungen nicht mehr.

Alle Details sind in " shallow.c: Die 8 Schritte zum Auswählen neuer Commits für .git/shallow ".

Sie können die Konsequenz in Commits wie d7d285 , f2c681c und c29a7b8 sehen, die Klon, Send-Pack/Receive-Pack mit/von Shallow unterstützen Klone.
smart-http unterstützt jetzt auch Shallow Fetch/Clone .
Sie können sogar einen flachen Repo klonen .

Update 2015: Mit git 2.5+ (Q2 2015) ist sogar ein Single-Commit-Abruf möglich! Siehe " Ein bestimmtes Commit aus einem entfernten Git-Repository ziehen ".

Update 2016 (Okt.): Git 2.11+ (Q4 2016) ermöglicht das Abrufen von:

11
VonC

Wenn Sie einen bestimmten Zweig auswählen können, kann dies sogar noch schneller sein. Hier ist ein Beispiel für die Verwendung von Spark master branch und latest tag:

Anfänglicher Klon

git clone [email protected]:Apache/spark.git --branch master --single-branch --depth 1

pdate auf bestimmtes Tag

git fetch --depth 1 Origin tags/v1.6.0

Es wird sehr schnell, Tags/Verzweigungen auf diese Weise zu wechseln.

9
Martin Tapp

Ich weiß nicht, ob es zu Ihrer Einrichtung passt, aber ich benutze es, einen vollständigen Klon eines Repos in einem separaten Verzeichnis zu haben. Dann mache ich einen flachen Klon aus dem Remote-Repository mit Bezug auf das lokale.

git clone --depth 1 --reference /path/to/local/clone [email protected]/group/repo.git 

Auf diese Weise werden nur die Unterschiede zum Referenz-Repository und Remote tatsächlich abgerufen. Um es noch schneller zu machen, können Sie das --shared -Option, aber lesen Sie die Einschränkungen in der git -Dokumentation (dies kann gefährlich sein).

Außerdem habe ich herausgefunden, dass der Klon unter bestimmten Umständen zu viele Daten abruft, wenn sich die Fernbedienung stark verändert hat. Es ist gut, es dann zu brechen und das Referenz-Repo zu aktualisieren (was seltsamerweise viel weniger Bandbreite beansprucht als ursprünglich) und dann den Klon erneut zu starten.

1
Rajish