Tutorial
Um git-lfs nutzen zu können, muss git 1.8.2 oder neuer installiert sein. Sie können das durch aufrufen von git --version überprüfen.
Erzeugen eines neuen Repos
git init . echo Hallo Welt > README.md git add README.md git commit -m "Initial commit" |
Weitere Dateien erzeugen
ls > foo.txt ls > bar.txt |
und diese dann in git hinzufügen
git add foo.txt bar.txt |
Sie sollten bereits git-lfs installiert haben. Um sicherzustellen, dass git-lfs in Ihren Git-Konfigurationsdateien korrekt eingerichtet ist, verwenden Sie den Befehl git lfs install:
git lfs install |
Nun erzeugen Sie ein paar große Dateien, die mittels git-lfs versioniert werden sollen:
dd if=/dev/urandom of=cat.bin bs=1048576 count=1 dd if=/dev/urandom of=dog.bin bs=1048576 count=1 |
Jetzt wird sichergestellt, dass git-lfs die großen *.bin-Dateien trackt, die Sie gerade erstellt haben. Tracking bedeutet, dass diese Dateien bei nachfolgenden Commits nun LFS-Dateien sind.
Hinweis: Dies bedeutet NICHT, dass Versionen der Dateien in früheren Commits konvertiert werden. Dabei handelt es sich um einen Prozess, der allgemein als "Rewriting History" bekannt ist und im Abschnitt Migration beschrieben wird.
Das wird erreicht, in dem Sie ein track Muster mit dem Befehl git lfs track setzen:
git lfs track '*.bin' |
Dies weist git-lfs an, alle Dateien zu tracken, die dem *.bin-Muster entsprechen. Die Anführungszeichen um *.bin sind da, um zu verhindern, dass die Shell die *.bin durch die einzelnen Dateinamen ersetzt, sonst würden Sie am Ende nur noch cat.bin und dog.bin tracken und keine anderen bin-Datei in der Zukunft.
Um alle track Muster zu sehen, führen Sie git lfs track ohne Argumente aus:
Listing tracked paths *.bin (.gitattributes) |
Um die Liste der Dateien zu sehen, die von git-lfs getrackt werden, führen Sie git lfs ls-files aus. Sie werden sehen, dass diese Liste derzeit leer ist. Dies liegt daran, dass die Datei technisch gesehen erst dann ein lfs-Objekt ist, wenn Sie es übertragen haben.
Als nächstes müssen Sie .gitattributes zu Ihrem git-Repository hinzufügen. git lfs track speichert die Muster der getrackten Dateien in .gitattributes. Auf diese Weise bleiben beim Klonen des Repos die getrackten Dateimuster erhalten.
git add .gitattributes |
Nun können Sie auch die *.bin-Dateien dem Repository hinzufügen, da diese nun mit git-lfs getrackt werden
git add "*.bin" |
Nun sollte git status so aussehen:
On branch master Changes to be committed: (use "git reset HEAD <file>..." to unstage) new file: .gitattributes new file: bar.txt new file: cat.bin new file: dog.bin new file: foo.txt |
Zum Schluß, committen Sie die neuen Dateien:
git commit -m "Add files" |
Wenn Sie nun git lfs ls-files ausführen, sehen Sie die verfolgten Dateien
f05131d24d * cat.bin 7db207c488 * dog.bin |
Hinzufügen von git-lfs zu einem bereits bestehenden Repository
Erstellen Sie ein Scheinrepo, um zu verstehen, wie die Konvertierung in git-lfs funktioniert.
git init . touch README.md git add README.md git commit -m "initial" git tag one echo hi > plain.txt ls > foo.bin git add plain.txt foo.bin git commit -m "Add some files" git tag two echo bye > plain.txt ls > bar.bin ls > foo.bin git add plain.txt foo.bin bar.bin git commit -m "Update and add another file" git tag three echo bye >> plain.txt ls > foo.bin git add plain.txt foo.bin git commit -m "Update some more" git tag four |
Nun entscheiden Sie, dass *.bin Dateien in git lfs Objekte gewandelt werden sollen:
git lfs track '*.bin' git add .gitattributes git commit -m "Track .bin files" git tag not_working |
Das Tracken von Dateien konvertiere diese Dateien NICHT in lfs-Objekte. Sie sind bereits Teil der git History. Die einzige Möglichkeit, alte Dateien zu konvertieren, besteht darin, die git History neu zu schreiben (siehe Abschnitt über die Migration vorhandener Daten).
Als nächstes können Sie versuchen, nur die neuesten Commits nach LFS zu konvertieren. Da *.bin-Dateien derzeit getrackt werden, müssen Sie nur die Dateien nach dem Entfernen wieder hinzufügen. Im folgenden Schritt werden Sie die Dateien aus dem Git entfernen, ohne die Dateien zu löschen (alias remove cache), und sie dann wieder hinzufügen.
git rm --cached *.bin git add *.bin git commit -m "Convert last commit to LFS" |
Nun zeigt git lfs ls-lfs:
4665a5ea42 * bar.bin 4665a5ea42 * foo.bin |
Sie können nun auch überprüfen, dass foo.bin ein LFS Objekt ist, in dem Sie git show HEAD:foo.bin ausführen:
version https://git-lfs.github.com/spec/v1 oid sha256:4665a5ea423c2713d436b5ee50593a9640e0018c1550b5a0002f74190d6caea8 size 36 |
Schauen Sie sich nun die bisherigen commits an. Sie sehen, dass die Dateien immer noch nicht als LFS Objekte getrackt werden:
git show not_working:foo.bin bar.bin foo.bin plain.txt README.md |
Es ist wichtig zu verstehen, dass das Tracking einer LFS-Datei diese nicht aus einem früheren Commit entfernt. Wenn Sie ein Repo ohne vorheriges LFS erstellen und dort Hunderte von MB einfügen, hat die alte Version nach all diesen Schritten immer noch alle großen Dateien in git, nicht in LFS.
Migration bestehender Repository-Daten nach LFS
Manchmal enden Dateien in Ihrem Repository, obwohl diese mit LFS hätten übertragen werden sollen. Dies kann versehentlich geschehen oder bei der Konvertierung eines bestehenden Git-Repositorys in Git LFS auftreten. Um dies zu ermöglichen, wird Git LFS mit einem Befehl git lfs migrate ausgeliefert, der solche Migrationen ermöglicht:
Nutzen von git lfs migrate
- Installieren Sie Git LFS v2.2.1 oder neuer
Schreiben Sie z.B. alle *.mp4-Videodateien des aktuellen Zweiges neu, die nicht auf einem Remote-Server vorhanden sind:
git lfs migrate import --include="*.mp4"Alternativ können Sie alle *.mp4-Videodateien auf einem oder mehreren Branches neu schreiben, unabhängig davon, ob sie auf einem Remote-Server vorhanden sind (kann einen Force-Push erfordern):
git lfs migrate import --include="*.mp4" --include-ref=refs/heads/master --include-ref=refs/heads/my-featurePushen Sie das konvertierte Repository als neues Repository:
git push
Bereinigung des .git-Verzeichnisses nach der Migration
Das oben beschriebene Verfahren konvertiert erfolgreich bereits vorhandene Git-Objekte in lfs-Objekte. Die regulären Objekte verbleiben jedoch weiterhin im .git-Verzeichnis. Diese werden eventuell von git gereinigt, aber um sie sofort zu reinigen, können Sie folgendes ausführen:
git reflog expire --expire-unreachable=now --all git gc --prune=now |