Sie befinden sich im Service: Software Engineering Services (GitLab)

Tutorial

Tutorial

Detailinformation

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 einer Fernbedienung 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-feature
  • Pushen 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