Große Git-Repositorys können viele Ressourcen verbrauchen und Ihren Computer verlangsamen.
Große Git-Repositorys können viele Ressourcen verbrauchen und Ihren Computer verlangsamen. Dies kann manchmal durch die Verwendung von Shallow Cloning abgemildert werden, das alle Commits außer den aktuellsten verwirft und das Herunterladen von Git-Repositorys mit langer Historie erleichtert.
Was ist Shallow Clone?
Beim Klonen eines Repositorys wird nicht nur eine Kopie des gesamten Repositorys erstellt, sondern auch dessen kompletter Commit-Verlauf. Bei den meisten Repositorys ist die Gesamtgröße und Länge des Commit-Verlaufs kein Problem. Bei wirklich großen Repositorys kann das Klonen aller Daten jedoch zeitaufwändig und ressourcenintensiv sein.
Beispielsweise verwendet der Linux-Kernel seit Anbeginn der Zeit dasselbe Repository. Es verfügt über mehr als 1,1 Millionen Commits. Das Klonen dieses Repositorys kann auf älterer Hardware über eine Stunde dauern und mehrere Gigabyte RAM allein für den Git-Prozess verbrauchen. Natürlich ist nicht jedes Repository so groß, aber einige kommen dem nahe, und selbst Linux-Kernel-Mitwirkende möchten nicht eine Stunde lang an ihrer Tastatur sitzen und zusehen, wie es geklont wird.
Shallow Cloning ist eine Technik, die nur eine begrenzte Anzahl neuer Commits abruft. Das Ergebnis ist ein leichter und schneller Klon, der dennoch die für Ihre Arbeit erforderliche Funktionalität beibehält, da sich die meisten Leute nicht um ältere Commits kümmern und Sie weiterhin PRs übermitteln und Änderungen pushen können, ohne den gesamten Verlauf zu haben.
Dies bietet auch große Vorteile für Continuous Integration-Pipelines (CI/CD), da der Build-Server wahrscheinlich nicht den gesamten Git-Verlauf kennen muss, nur um die Anwendung zu erstellen. Wenn Sie Skripte schreiben, die mit Git-Repos funktionieren und sich nur für den Inhalt interessieren, kann es sich lohnen, stattdessen Shallow Cloning zu verwenden.
Abgesehen von der Klonzeit laufen flache Repositories im Allgemeinen schneller, da beim Ausführen alltäglicher Befehle weniger Verlauf zu verarbeiten ist. Sehr lange Verläufe können auch dazu führen, dass GUI-Git-Clients verzögert werden, was das Erlebnis ruinieren kann.
Oberflächliches Klonen eines Git-Repositorys
–depth Der einfachste Weg zum oberflächlichen Klonen besteht darin, einfach den Parameter on zu verwenden git clone. Dadurch wird der Klon auf eine bestimmte Anzahl begrenzt, z. B. 100 Commits vor dem aktuellen Repository-HEAD. Alle anderen älteren Commits werden aus dem Verlauf entfernt.
Sie können auch alles nach einem bestimmten Datum oberflächlich klonen, was viel nützlicher ist, wenn Sie nicht wissen, wie viele Commits Sie benötigen.
Der Datumsparameter kann viele verschiedene Formate annehmen , aber ein einfaches „vor X Jahren/Monaten“ funktioniert im Allgemeinen gut.
Es gibt auch Methoden, um ein vorhandenes Git-Repository zu verkleinern , aber diese sind normalerweise chaotisch und erfordern das Neuschreiben des Verlaufs und das manuelle Löschen aller alten Objekte aus dem Garbage Collection-Cache von Git. Wir empfehlen, einfach alle Änderungen zu pushen, das alte Repository zu entfernen und erneut vom Remote-Repositorium zu klonen, wenn Sie die Größe Ihres vorhandenen Repositorys reduzieren möchten.
Shallow Clone nur eines einzigen Zweigs
Shallow Cloning kann mit einer anderen Git-Funktion kombiniert werden, die das Klonen auf nur einen einzigen Zweig beschränkt. Wenn Sie nur ein Repository herunterladen, um einen Feature-Zweig auszuchecken, können Sie stattdessen diesen Befehl ausführen:
Blobless- und Treeless-Klone
Eine weitere ähnliche Option, mit der der Commit-Verlauf erhalten bleibt, ist die Verwendung von blobless-Klonen . In Git werden die tatsächlichen Dateiinhalte als „Blobs“ gespeichert, und Git fügt darüber Bäume und Commits hinzu, die verfolgen, wie diese Blobs zusammenpassen.
Da Git sich hauptsächlich nur um die Commits und die Baumstruktur kümmert, können Sie die Blobs weglassen und sie bei Bedarf herunterladen. Dies kann die Klonzeiten erheblich verkürzen und gleichzeitig den Verlauf beibehalten. Sie können auch bloblose und Shallow Clone kombinieren.
Führen Sie dazu git clonemit einem Filtersatz Folgendes aus:
Baumlose Klone sind ähnlich und werden oft zur Automatisierung verwendet, sind aber für den täglichen Gebrauch normalerweise nicht zu empfehlen, da sie bei alltäglichen Git-Operationen tatsächlich langsamer sein können freeform.
Normalerweise sind Shallow Clone jedoch immer noch schneller und Blobless-Klone werden mit der Zeit größer, da auf mehr Teile des Repository zugegriffen werden muss.