Wie konvertiert man eine von git verfolgte Datei in git-lfs?

Lesezeit: 4 Minuten

Wie konvertiere ich eine einzelne Datei (z. B. ein PNG), die bereits als reguläres Objekt an git-lfs übergeben wurde?

Ich möchte nicht das gesamte Repo migrieren und ich möchte auch nicht die Historie des Repos neu schreiben.

  • Ich bin mir nicht sicher, ob ich das verstehe: Wenn Sie git lfs track die Datei, wird sie nun nachverfolgt git-lfs und nachfolgende Commits enthalten nicht die gesamte Datei. Dies wirkt sich jedoch nicht auf frühere Commits aus, die Sie kann nicht ohne die Geschichte umzuschreiben.

    – Eduard Thomson

    9. November 2017 um 10:48 Uhr

  • Also muss ich eine Änderung an der bereits verfolgten Datei vornehmen und dann wird ein nachfolgender Commit die Datei so umschalten, dass sie von git-lfs verfolgt wird?

    – Lars Bilke

    9. November 2017 um 11:06 Uhr

  • Nö! git lfs track funktioniert gut mit vorhandenen Dateien und führt die Konvertierung durch. Danke für die Klarstellung, ich werde eine Antwort hinzufügen.

    – Eduard Thomson

    9. November 2017 um 11:11 Uhr

git lfs track beginnt mit der Verfolgung einer neuen Datei oder eine vorhandene Datei, die bereits in Ihr Repository eingecheckt ist. Wenn du rennst git lfs track und dann diese Änderung festschreiben, wird die Datei aktualisiert und durch den Inhalt des LFS-Zeigers ersetzt.

Hier habe ich ein Repository mit einem PNG “normal” eingecheckt (ohne LFS zu verwenden):

C:\Temp\LFS>dir
 Volume in drive C is Windows
 Volume Serial Number is A442-238A

 Directory of C:\Temp\LFS

11/09/2017  11:12 AM    <DIR>          .
11/09/2017  11:12 AM    <DIR>          ..
10/20/2017  01:22 PM            48,517 VSTS.png
               1 File(s)         48,517 bytes
               2 Dir(s)  284,988,436,480 bytes free

C:\Temp\LFS>git status
On branch master
nothing to commit, working tree clean

Ich muss keine Änderungen am PNG vornehmen, ich kann einfach git lfs track es:

C:\Temp\LFS>git lfs track VSTS.png
Tracking "VSTS.png"    

Und git-lfs hat alles Nötige getan – es hat die Tracking-Informationen in der .gitattributes, und jetzt weiß git das VSTS.png wird geändert:

C:\Temp\LFS>git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   VSTS.png

Untracked files:
  (use "git add <file>..." to include in what will be committed)

        .gitattributes

no changes added to commit (use "git add" and/or "git commit -a")

Wenn wir jetzt git add die Datei, wird das LFS-Objekt zum Repository hinzugefügt, und wir können die Änderungen festschreiben. Was wird eigentlich getan werden ist das git-lfs stellt diese Datei für die LFS-Speicherung in die Warteschlange und ersetzt die Datei im Repository durch eine Zeigerdatei, die LFS mitteilt, wo der tatsächliche Blob zu finden ist, den wir sehen können, wenn wir den Inhalt der Phase des Repositorys untersuchen:

C:\Temp\LFS>git add VSTS.png

C:\Temp\LFS>git cat-file blob :0:VSTS.png
version https://git-lfs.github.com/spec/v1
oid sha256:6075cd5130bdbe29a037cba93dc22158d1443b22b2ffb6acb0d1d541838f26b9
size 48517

(Das sind die eigentlichen LFS-Metadaten anstelle der PNG-Datei.)

Wenn Sie diese Änderungen jetzt festschreiben und übertragen, befindet sich die Datei in LFS. Dies ist jedoch nicht rückwirkend – Sie schreiben den Verlauf des Repositorys nicht neu, sodass sich frühere Versionen des PNG immer noch direkt im Repository befinden (nicht in LFS) und weiterhin Speicherplatz beanspruchen.

Wenn Sie den Verlauf neu schreiben möchten, würde ich die Verwendung von empfehlen BFG Repo-Reiniger.

  • Danke vielmals! Es funktioniert, aber eine zusätzliche Sache, die ich getan habe, um das beabsichtigte Verhalten zu erhalten, ist, die Änderungen an zu verwerfen .gitattributes Am Ende. Ich verfolge bereits *.png und benötigen keinen zusätzlichen Tracking-Eintrag für zB VSTS.png in .gitattributes.

    – Lars Bilke

    9. November 2017 um 13:11 Uhr

  • Was ist, wenn sich die Datei ständig ändert, wird sie viele Male gespeichert oder nur die Unterschiede wie jede andere Datei im Repo?

    – Lestat

    7. August 2020 um 12:51 Uhr

  • @Lestat Der lfs-Text-Stub wird jedes Mal, wenn sich die Datei ändert, mit der Dateigröße und -größe aktualisiert, sodass er wie jede andere Datei im Repo ist. Die Datei selbst muss zwar jedes Mal hochgeladen werden, aber die historischen Änderungen tragen nicht zur Repo-Größe bei, wenn Sie sie klonen.

    – Eduard Spencer

    30. September 2021 um 10:07 Uhr

  • @EdwardSpencer Danke. Gut zu wissen.

    – Lestat

    10. Dezember 2021 um 16:21 Uhr

  • Was ist andersherum. Konvertieren Sie die Dateiform LFS in eine normale Datei?

    – Royi

    8. Februar um 13:19 Uhr

1205660cookie-checkWie konvertiert man eine von git verfolgte Datei in git-lfs?

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

Privacy policy