Wie speichert Git doppelte Dateien?

Lesezeit: 6 Minuten

Wir haben ein Git-Repository, das SVM-KI-Eingabedaten und -Ergebnisse enthält. Jedes Mal, wenn wir ein neues Modell ausführen, erstellen wir einen neuen Stammordner für dieses Modell, damit wir unsere Ergebnisse im Laufe der Zeit organisieren können:

/run1.0
  /data
    ... 100 mb of data
  /classification.csv
  /results.csv
  ...
/run2.0
  /data
    ... 200 mb of data (including run1.0/data)
  /classification.csv
  /results.csv
  ...

Wenn wir neue Modelle erstellen, können wir Daten (große .wav-Dateien) aus einem früheren Lauf abrufen. Das bedeutet, dass unser Datenordner 2.0 alle Dateien aus 1.0/data plus zusätzliche Daten enthalten kann, die wir möglicherweise gesammelt haben.

Das Repo wird leicht ein Gigabyte überschreiten, wenn wir so weitermachen.

Hat Git eine Möglichkeit, doppelte Binärdateien zu erkennen und nur einmal zu speichern (z. B. wie ein Symlink)? Wenn nicht, werden wir die Speicherung der Daten überarbeiten.

Benutzer-Avatar
Dave Küster

Ich werde das wahrscheinlich nicht ganz richtig erklären, aber ich verstehe, dass jeder Commit nur eine Baumstruktur speichert, die die Dateistruktur Ihres Projekts mit Zeigern auf die eigentlichen Dateien darstellt, die in einem Unterordner von Objekten gespeichert sind. Git verwendet einen SHA1-Hash des Dateiinhalts, um den Dateinamen und den Unterordner zu erstellen. Wenn also beispielsweise der Inhalt einer Datei den folgenden Hash erstellt:

0b064b56112cc80495ba59e2ef63ffc9e9ef0c77

Es würde gespeichert als:

.git/objects/0b/064b56112cc80495ba59e2ef63ffc9e9ef0c77

Die ersten beiden Zeichen werden als Verzeichnisname und der Rest als Dateiname verwendet.

Das Ergebnis ist, dass selbst wenn Sie mehrere Dateien mit demselben Inhalt, aber unterschiedlichen Namen oder an verschiedenen Orten oder von verschiedenen Commits haben, immer nur eine Kopie gespeichert wird, aber mit mehreren Zeigern darauf in jedem Commit-Baum.

  • Interessant … das würde sehr viel Sinn machen und ich habe mich gefragt, ob dies der Fall ist. Ich muss ein bisschen graben, um zu sehen, ob dies tatsächlich der Fall ist (wenn ich etwas Freizeit habe).

    – JoshuaJ

    29. April 2015 um 16:54 Uhr

  • pastebin.com/p0KpqBPX für diejenigen unter Ihnen, die zu faul zum Experimentieren sind 🙂 Gleiches Objekt, nur geringfügig mehr Platz erforderlich als 1 Datei in .git/objects

    – opatut

    29. April 2015 um 18:09 Uhr

  • Eigentlich macht das jetzt Sinn. Git erkennt eine verschobene Datei anhand ihres SHA, daher wäre es sinnvoll, dass Git standardmäßig problemlos dieselbe Datei an mehreren Stellen im Repo-Baum erkennen könnte.

    – JoshuaJ

    29. April 2015 um 19:23 Uhr

Benutzer-Avatar
Matrixanomalie

Standardmäßig/selbst: Nein. Ja.

Git funktioniert auf der Grundlage, dass es Snapshots von Dateien erstellt und keine inkrementellen Unterschiede wie andere VCS.

BEARBEITEN

Wie von Dave und opatut erwähnt, war mein Verständnis davon, wie git Dateien speichert, falsch und ich entschuldige mich für die verursachte Verwirrung. Nach mehr Recherche speichert Git duplizierte Dateien als Verweise auf 1 Datei. Zitieren von VonC in der akzeptierten Antwort auf diese Frage,

… mehrere Dateien mit gleichem Inhalt nur einmal gespeichert werden.

Bitte beachten Sie auch, dass, wie in dieser Antwort erwähnt, konzeptionell

Verweis auf die git-scm-Dokumentation:

Git betrachtet seine Daten eher als eine Reihe von Schnappschüssen eines Miniaturdateisystems. Jedes Mal, wenn Sie den Status Ihres Projekts in Git übergeben oder speichern, macht es im Grunde genommen ein Bild davon, wie alle Ihre Dateien in diesem Moment aussehen, und speichert einen Verweis auf diesen Schnappschuss. Um effizient zu sein, Wenn sich Dateien nicht geändert haben, speichert Git die Datei nicht erneut, nur ein Link auf die vorherige identische Datei, die es bereits gespeichert hat. Git betrachtet seine Daten eher wie einen Stream von Snapshots.

Allerdings auf Speicherebene, werden immer noch Deltas verwendet, bei denen Git versucht, das kleinstmögliche Delta basierend auf einer heuristischen Auswahl von Blobs so schnell wie möglich zu generieren, es gibt Optionen, die die Komprimierung optimieren. Dadurch wird die Größe des Repositorys reduziert.

Auch wie von opatut in seinem getestet Pastebin-Link von Ausgaben aus den Kommentaren werden doppelte Objekte nur einmal gespeichert. Das bedeutet, dass git doppelte Binärdateien erkennt und nur einmal speichert. Das war, was die ursprüngliche Frage verlangte. Im Folgenden finden Sie weitere Optionen zum Umgang mit doppelten Dateien.

Andere Alternative: Symlinks

Sie können Symlinks zu den vorherigen Dateien einrichten, damit diese beim Bearbeiten auf dieselbe große Datei verweisen, beachten Sie dies jedoch git verfolgt nicht die Dateien, auf die die Symlinks verweisenwas bedeutet, dass sie es tun werden nur Speichern Sie den Symlink. Dies befriedigt Ihre Notwendigkeit, Platz zu sparen, auf Kosten der Portabilität, d. h. wenn Sie zu einem anderen Entwicklungscomputer wechseln, müssen Sie sicherstellen, dass sich die Dateien dort befinden, wo die symbolischen Links hindeuten. Was vielleicht nicht das ist, was Sie wollen. Sehen Sie sich dieses sehr gute SO Q&A an, was Git mit Symlinks macht.

Eine weitere Alternative: Werkzeuge!

Ich habe mehrere Tools gefunden, die Ihnen helfen könnten, das zu erreichen, was Sie zum Verwalten von Binärdateien benötigen.

Du kannst es versuchen git-annexwo im Grunde nur die neueste Version von Binärdateien verfolgt wird und der Rest durch Symlinks verwaltet wird, also in gewisser Weise eine automatischere Art, symbolische Links zu handhaben. Hier ist ihre Projektseite.

Oder das eingebaute git-submodules und ein separates Repo, um das zu erreichen, was Sie wollen, wo Sie nur die großen Binärdateien abrufen, um sie zu verwenden.

Zugegebenermaßen habe ich diese Optionen nicht ausprobiert, daher finden Sie hier den Referenzlink, um weitere Erklärungen dazu zu lesen. Referenz: diese SO-Frage

  • Was für eine fantastische Antwort. Ich fing an, die Idee von Symlinks im Geiste zu erforschen, war mir aber nicht sicher, was verfügbar war. Ich werde dem jetzt nachgehen. Vielen Dank.

    – JoshuaJ

    29. April 2015 um 15:54 Uhr

  • @JoshJ kein Problem, ich bin froh, dass ich helfen konnte, und ich bin sehr beeindruckt von deinem Kompliment. viel erfolg bei der umsetzung!

    – Matrixanomalie

    29. April 2015 um 16:12 Uhr

  • Ihre Antwort ist irreführend und etwas verwirrend, IMO. Tatsächlich betrachtet Git zwei Dateien mit demselben SHA als identisch, ihre Pfade spielen keine Rolle. Für die Frage von OP ist es in Ordnung, git speichert dieselbe Datei nicht mehrmals. Siehe Dave Sextons Antwort für den Grund.

    – opatut

    29. April 2015 um 17:49 Uhr


  • @opatut Ich habe meine Antwort korrigiert und Ihren Pastebin mit Kommentaren in meine Antwort eingefügt. Sorry für die Verwirrung, OP und alle anderen. Daves Antwort trifft mehr zu und seine Antwort sollte akzeptiert werden

    – Matrixanomalie

    29. April 2015 um 18:15 Uhr

  • Mein Downvote soll dann in ein Upvote umgewandelt werden 🙂 Trotzdem gute Recherche zu den anderen Optionen.

    – opatut

    29. April 2015 um 18:46 Uhr

Selbst wenn git die Dateien einmal speichert, was Ihnen die Arbeit erspart, verwenden Sie ein VCS auf schlechte Weise und verlieren alle Vorteile der Verwendung eines VCS, da Sie nicht sehen können, welche Änderungen zwischen 2 Versionen vorgenommen wurden.

Sie sollten besser ein ‘Run’-Verzeichnis mit Ihren Dateien haben und für jede neue Version einen Commit durchführen (sogar mit Tags, wenn Sie Ihre wichtigen ‘Runs’ leichter sehen möchten).

Auf diese Weise können Sie das, was zwischen den Versionen gemacht wurde, senden und Ihre Arbeit verbessern.

Sie müssen nicht alles in Sonnenblumen aufbewahren!

Was du zu tun versuchst, ist eine schlechte Sache!!

  • Ja, das sind leider keine Versionsnummern. Dies sind völlig unterschiedliche Modellausführungen, und es kann erforderlich sein, Informationen zwischen ihnen auszutauschen und alle in einem einzigen Checkout abzurufen, ohne zwischen Revisionen wechseln zu müssen.

    – JoshuaJ

    30. April 2015 um 2:00 Uhr

1205910cookie-checkWie speichert Git doppelte Dateien?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy