Git

Git Shallow Clone und Clone Depth

Git Shallow Clone und Clone Depth

Grundlegendes zu Git Shallow Clone und Clone Depth

Git ist ein verteiltes Versionskontrollsystem. Das ist einer der Vorteile von Git. Sie müssen nicht auf einen zentralen Server oder ein zentrales Repository angewiesen sein, um lokal zu arbeiten. Alles, was Sie in Bezug auf Ihre Modulhistorie benötigen, haben Sie direkt zur Hand. Es kann jedoch zu einem Problem werden, wenn Sie mit Repositorys mit großen Binärdateien oder Repositorys mit langer Historie arbeiten. Vor allem, wenn Sie eine Situation haben, in der Sie es jedes Mal neu herunterladen müssen, z. B. bei einem Build-Server, können die Größe und die Download-Zeiten zum Problem werden.

Gits Lösung für das Problem ist ein flacher Klon, bei dem Sie die Klontiefe verwenden können, um zu definieren, wie tief Ihr Klon gehen soll. Wenn Sie beispielsweise -depth 1 verwenden, erhält Git beim Klonen nur die neueste Kopie der relevanten Dateien relevant. Es kann Ihnen viel Platz und Zeit sparen.

Git Shallow Clone und Größe

Werfen wir einen Blick auf das beliebte Git-Repository für Django. Wenn Sie das Repository vollständig klonen, erhalten Sie Folgendes:

$ git-Klon https://github.com/django/django.git
Klonen in 'django'…
remote: Objekte zählen: 409053, fertig.
remote: Objekte komprimieren: 100% (26/26), fertig.
Fernbedienung: Gesamt 409053 (Delta 6), wiederverwendet 8 (Delta 1), Packung wiederverwendet 409026
Empfangene Objekte: 100% (409053/409053), 167.77 MiB | 5.95 MiB/s, fertig.
Deltas auflösen: 100 % (297045/297045), fertig.
Konnektivität prüfen… fertig.
Dateien auschecken: 100% (5860/5860), fertig.

Wenn Sie nun die Größe Ihrer lokalen Kopie überprüfen, lautet sie:

$ du -sh django/
225 Millionen    Django/

Holen wir uns das gleiche Django-Repository mit einem flachen Klon:

$ git clone --depth 1 https://github.com/django/django.git
Klonen in 'django'…
remote: Objekte zählen: 8091, fertig.
remote: Objekte komprimieren: 100% (4995/4995), fertig.
Fernbedienung: Gesamt 8091 (Delta 2036), wiederverwendet 5507 (Delta 1833), Packung wiederverwendet 0
Empfangene Objekte: 100% (8091/8091), 8.82 MiB | 3.29 MiB/s, fertig.
Deltas auflösen: 100 % (2036/2036), fertig.
Konnektivität prüfen… fertig.
Dateien auschecken: 100% (5860/5860), fertig.

Wenn Sie nun die Größe Ihrer lokalen Kopie überprüfen, sollte sie deutlich kleiner sein:

$ du -sh django/
55 Millionen       Django/

Wenn Ihr Server Hunderte von Produktlinien umfasst, kann diese Art der Festplattenplatzeinsparung hilfreich sein. Bei Spielprojekten mit umfangreichen Binärdateien kann dies dramatische Auswirkungen haben. Es hilft auch bei langjährigen Projekten. Zum Beispiel ist das Klonen des vollständigen Linux-Repositorys von GitHub mehr als 7 GB, aber Sie können es für weniger als 1 GB flach klonen.

Git Shallow Clone und Verlauf

Sie können das flache Klonen lokal mit Ihrem eigenen Repository auschecken. Lassen Sie uns eine Datei in unserem lokalen Repository erstellen, Änderungen vornehmen und sie 10 Mal festschreiben. Und dann können wir das Repository klonen:

$ mkdir _Beispiel
$ cd _Beispiel
$ ls
$ git init
Initialisiertes leeres Git-Repository in /Users/zakh/git_repo/_example/.git/
$ echo x > große_Datei
$ git add -A
$ git commit -m "Erstes Commit"
[master (root-commit) dd11686] Initiales Commit
1 Datei geändert, 1 Einfügung (+)
Modus erstellen 100644 large_file
$ echo xx > große_Datei
$ git add -A
$ git commit -m "Änderung an large_file 1"
[master 9efa367] Änderung an large_file 1
1 Datei geändert, 1 Einfügung (+), 1 Löschung (-)


$ mkdir-Test
$ CD-Test
$ git clone file:////Users/zakh/git_repo/_example
Klonen in '_example'…
Fernbedienung: Objekte zählen: 33, fertig.
remote: Objekte komprimieren: 100% (22/22), fertig.
Fernbedienung: Gesamt 33 (Delta 10), wiederverwendet 0 (Delta 0)
Empfangen von Objekten: 100% (33/33), 50.03 MiB | 42.10 MiB/s, fertig.
Deltas auflösen: 100% (10/10), fertig.
Konnektivität prüfen… fertig.

In diesem Beispiel haben wir das _example git Repository im Ordner /Users/zakh/git_repo/ mit einer einzelnen large_file erstellt. Es werden nur die ersten beiden Commits angezeigt. Dann erstellen wir einen vollständigen Klon dieses Repositorys an einem anderen Ort.

Schauen wir uns dann den Verlauf unserer Commits an:

$ git log --oneline
7fa451f Änderung an large_file 10
648d8c9 Änderung an large_file 9
772547a Änderung an large_file 8
13dd9ab Änderung zu large_file 7
5e73b67 Änderung an large_file 6
030a6e7 Änderung an large_file 5
1d14922 Änderung an large_file 4
bc0f2c2 Änderung an large_file 3
2794f11 Änderung an large_file 2
d4374fb Änderung an large_file 1
924829d Erster Commit

Wir sehen alle Commits im vollständigen Klon.
Jetzt löschen wir die aktuelle Kopie und dann einen flachen Klon mit einer Tiefe von 1:

$ git clone --depth 1 file:////Users/zakh/git_repo/_example
Klonen in '_example'…
Fernbedienung: Objekte zählen: 3, fertig.
remote: Objekte komprimieren: 100% (2/2), fertig.
Fernbedienung: Gesamt 3 (Delta 0), wiederverwendet 0 (Delta 0)
Empfangen von Objekten: 100% (3/3), 50.02 MiB | 65.12 MiB/s, fertig.
Konnektivität prüfen… fertig.

Wenn wir uns jetzt den Verlauf ansehen, sehen wir nur den letzten Commit-Verlauf:

$ git log --oneline
7fa451f Änderung an large_file 10

Lassen Sie uns mit einer Tiefe von 3 flach klonen:

$ git clone --depth 3 file:////Users/zakh/git_repo/_example
Klonen in '_example'…
Fernbedienung: Objekte zählen: 9, fertig.
remote: Objekte komprimieren: 100% (6/6), fertig.
Fernbedienung: Gesamt 9 (Delta 2), wiederverwendet 0 (Delta 0)
Empfangen von Objekten: 100% (9/9), 50.02 MiB | 65.15 MiB/s, fertig.
Deltas auflösen: 100% (2/2), fertig.
Konnektivität prüfen… fertig.

Jetzt sehen wir mehr Commits:

$ git log --oneline
7fa451f Änderung an large_file 10
648d8c9 Änderung an large_file 9
772547a Änderung an large_file 8

Probleme mit Git Shallow Clone

Benutzer sollten verstehen, dass die Einsparungen bei Größe und Downloadzeit von der Organisation der Commits abhängen. Sie können sich von einem Repository zum anderen erheblich unterscheiden. Es ist eine gute Idee, das Repository mit einem flachen Klon zu testen, um zu überprüfen, wie viel Festplattenspeicher und Downloadzeit Sie dadurch sparen.

Eine weitere Überlegung ist, dass, obwohl Sie Code von einem flachen Klon übertragen können, dies aufgrund der Berechnungen zwischen dem Remote- und dem lokalen Server länger dauern kann. Wenn Sie also regelmäßig Code aus der lokalen Kopie übertragen, ist es wahrscheinlich sinnvoll, einen vollständigen Klon zu verwenden.

Mehrfachverzweigungsoption

Wenn Sie das Flag -depth mit dem Befehl clone verwenden, nimmt Git standardmäßig das Flag -single-branch an. Aber Sie können das Flag -no-single-branch verwenden, um Git anzuweisen, Historien aus der angegebenen Tiefe jedes Zweigs abzurufen.

Hier sind die Django-Zweige ohne -no-single-branch-Option (Tiefe 1):

$ git branch -a
* Meister
Fernbedienungen/Ursprung/HEAD -> Ursprung/Master
Fernbedienungen/Ursprung/Master

Nur der Master-Zweig ist vorhanden.

Hier sind die Django-Zweige nach Verwendung der Option -no-single-branch:

$ git clone --depth 1 --no-single-branch https://github.com/django/django.git
Klonen in 'django'…
Fernbedienung: Objekte zählen: 95072, fertig.
remote: Objekte komprimieren: 100% (42524/42524), fertig.
Fernbedienung: Gesamt 95072 (Delta 52343), wiederverwendet 82284 (Delta 42389), Packung wiederverwendet 0
Empfangen von Objekten: 100% (95072/95072), 74.69 MiB | 3.95 MiB/s, fertig.
Deltas auflösen: 100 % (52343/52343), fertig.
Konnektivität prüfen… fertig.
Dateien auschecken: 100% (5860/5860), fertig.
$ du -sh django
124 Millionen        Django

Beachten Sie, dass, obwohl die Tiefe immer noch 1 beträgt, die Größe des Klons 124 M ist anstelle der 55 M im vorherigen Fall.
Wenn wir die Branches überprüfen, sollten wir viel mehr Branches auf diesem Klon sehen:

$ cd django
$ git branch -a
* Meister
Fernbedienungen/Ursprung/HEAD -> Ursprung/Master
Fernbedienungen/Ursprung/Dachboden/Boulder-Orakel-Sprint
Fernbedienungen/Herkunft/Dachboden/Vollständige Geschichte
Fernbedienungen/Herkunft/Dachboden/generic-auth
Fernbedienungen/Herkunft/Dachboden/gis
Fernbedienungen/Herkunft/Dachboden/i18n
Fernbedienungen/Herkunft/Dachboden/Magic-Entfernung
Fernbedienungen/Herkunft/Dachboden/Multi-Auth
Fernbedienungen/Ursprung/Dachboden/Multiple-DB-Unterstützung
Fernbedienungen/Ursprung/Dachboden/neuer Administrator
Fernbedienungen/Ursprung/Dachboden/newforms-admin
Fernbedienungen/Ursprung/Dachboden/Per-Objekt-Berechtigungen
remotes/origin/attic/queryset-refactor
Fernbedienungen/Ursprung/Dachboden/Schema-Evolution
Fernbedienungen/Ursprung/Dachboden/schema-evolution-ng
Fernbedienungen/Ursprung/Dachboden/Such-Api
Fernbedienungen/Ursprung/Dachboden/sqlalchemy
Fernbedienungen/Herkunft/Dachboden/Unicode
Fernbedienungen/Ursprung/Master
remotes/origin/soc2009/admin-ui
remotes/origin/soc2009/http-wsgi-improvements
Fernbedienungen/Ursprung/soc2009/i18n-Verbesserungen
Fernbedienungen/Ursprung/Soc2009/Modellvalidierung
Fernbedienungen/Ursprung/soc2009/multidb
Fernbedienungen/Ursprung/Soc2009/Test-Verbesserungen
remotes/origin/soc2010/app-loading
remotes/origin/soc2010/query-refactor
remotes/origin/soc2010/test-refactor
Fernbedienungen/Ursprung/Stabil/0.90.x
Fernbedienungen/Ursprung/Stabil/0.91.x
Fernbedienungen/Ursprung/Stabil/0.95.x
Fernbedienungen/Ursprung/Stabil/0.96.x
Fernbedienungen/Ursprung/Stabil/1.0.x
Fernbedienungen/Ursprung/Stabil/1.1.x
Fernbedienungen/Ursprung/Stabil/1.10.x
Fernbedienungen/Ursprung/Stabil/1.11.x
Fernbedienungen/Ursprung/Stabil/1.2.x
Fernbedienungen/Ursprung/Stabil/1.3.x
Fernbedienungen/Ursprung/Stabil/1.4.x
Fernbedienungen/Ursprung/Stabil/1.5.x
Fernbedienungen/Ursprung/Stabil/1.6.x
Fernbedienungen/Ursprung/Stabil/1.7.x
Fernbedienungen/Ursprung/Stabil/1.8.x
Fernbedienungen/Ursprung/Stabil/1.9.x
Fernbedienungen/Ursprung/Stabil/2.0.x

Zusammenfassung

Git flacher Klon kann Ihnen helfen, Zeit und Festplattenspeicher zu sparen. Aber es hat seinen Preis. Wenn Sie regelmäßig Code an Remote-Repositorys senden, verlängert sich die Commit-Zeit. Für normale Arbeitsabläufe ist es daher eine gute Idee, flache Klone zu vermeiden.

Verweise:

Schlacht um Wesnoth 1.13.6 Entwicklung veröffentlicht
Schlacht um Wesnoth 1.13.6, das letzten Monat veröffentlicht wurde, ist die sechste Entwicklungsversion im 1.13.x-Serie und bietet eine Reihe von Verb...
So installieren Sie League of Legends auf Ubuntu 14.04
Wenn Sie ein Fan von League of Legends sind, dann ist dies eine Gelegenheit für Sie, League of Legends zu testen. Beachten Sie, dass LOL von PlayOnLin...
Installieren Sie das neueste OpenRA-Strategiespiel auf Ubuntu Linux
OpenRA ist eine Libre/Free Real Time Strategy Game Engine, die die frühen Westwood-Spiele wie den Klassiker Command & Conquer: Red Alert Red nachbilde...