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.
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.
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-annex
wo 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
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!!