Git Large File Storage (LFS)

Posted by Start Bootstrap on April 12, 2016

Probleme mit großen Dateien.

Es ist kein Geheimnis, das Git nicht gut mit großen Dateien umgehen kann. Das Problem liegt dabei im dezentralen Ansatz. Alle Versionen einer Datei in jedem Repository vorzuhalten ist bei Sourcecode eine sinnvolle Idee um schnelle Vergleiche zu ermöglichen.

Bei großen (binären) Dateien stößt der Ansatz jedoch an seine Grenzen. Beim initiallen Klonen müssen alle Versionen aller Branches übertragen werden, obwohl nur eine Version im HEAD benötigt wird. Das gleiche trifft bei jeden Fetch zu.

Der typische Rat den man Einsteigern gibt, ist deswegen:

Verwalte keine große Dateien, insbesondere binäre Dateien, mit Git.

Wenn es aber sein muss!

Dieser Rat ist immer noch sinnvoll, doch es gibt Situationen in denen man auch größere binäre Dateien zusammen mit seinem Sourcecode versionieren will, zum Beispiel:

  • Grafische Assets bei der Spieleentwicklung
  • Testbilder um Vergleiche bei automatisierten Tests durchzuführen

Git LFS

Da kommt der Git Large File Storage (LFS) ins Spiel. Es ist eine Erweiterung um große Dateien ausserhalb des eigentlichen Git-Repos abzulegen und nur die Links im Repository zu versionieren.

Dabei ist der Austausch der Dateien durch Links und vice versa für den Benutzer transparent.

Wenn man ein Repository mit der LFS Erweiterung klont, wird als erstes nur das eigentliche Git-Repo kopiert. Anschließend werden im aktuellen Branch alle Links aufgelöst, d.h. die Dateien werden vom Storage (oder aus dem Cache) geladen und in den Workspace kopiert.

Bei jedem Fetch werden nur die eigentlichen Git-Objekte geholt. Erst beim Aktualisieren des Workspace (pull, checkout) müssen ggf. neue Versionen vom Storage geladen werden.

LFS installieren

  • Um LFS zu benutzen, muss als erstes die entsprechende Erweiterung installiert werden: LFS auf Github.
  • Anschließend muss LFS auf dem Rechner aktiviert werden, dabei werden in der globalen Config (~/.gitconfig) entsprechende Einträge hinzugefügt:

   git lfs install
 

Natürlich benötigt man nun noch einen geeigneten Git-Server mit LFS Support oder einen seperaten LFS-Storage, z.B.:

LFS im Repository aktivieren

LFS basiert auf der .gitattribute-Datei die in jedem Repository versioniert wird.

Mit dem Befehl git lfs track <file-or-dir> kann für Dateien oder Verzeichnisse das LFS-Tracking aktiviert werden.


   git lfs track *.jpg
   git lfs track bin/ `

Anschließend fügt man die entsprechenden Dateien einfach per git add zum Repository hinzu. Führt ein Commit durch und Pushed die Änderungen zum Server und damit auch durch LFS zum Storage.


   git add my-picture.jpg
   git commit -m "picture"
   git push