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.
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.
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
Ich bin mir nicht sicher, ob ich das verstehe: Wenn Sie
git lfs track
die Datei, wird sie nun nachverfolgtgit-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