Verschieben Sie die von Git LFS verfolgten Dateien unter reguläres Git


74

Ich habe ein Projekt, in dem ich Videodateien mit Git LFS gespeichert habe. Jetzt hatte ich einige Probleme mit meinem Build-Server, der Git LFS noch nicht unterstützt. Da es sich um einen externen Dienst handelt, kann ich den Erstellungsprozess nicht wirklich beeinflussen und möchte daher die Dateien von unter Git LFS zurück auf "normalen" Git verschieben. Ich habe es geschafft, die Dateitypen mit zu entfernen, git lfs untrack '<file-type>'aber es wird git lfs ls-filesimmer noch eine Liste der zuvor hinzugefügten Dateien angezeigt .

Ich stelle mir vor, ich könnte die Dateien entfernen, die Änderungen pushen und sie dann manuell wieder hinzufügen, aber ist dies wirklich die empfohlene Vorgehensweise?

Antworten:


96

Ich bin erst kürzlich auf dieses Problem gestoßen, bei dem Assets versehentlich zu git-lfs in einem Zweig hinzugefügt wurden, der nicht hätte sein sollen. Meine Lösung war:

git lfs untrack '<file-type>'
git rm --cached '<file-type>'
git add '<file-type>'
git commit -m "restore '<file-type>' to git from lfs"

Das Ergebnis ist ein Umschreiben der git-lfs oid sha256-Zeiger mit dem Standardinhalt der Datei.


(Bearbeiten 2019-03): Die akzeptierte Antwort wurde geändert, um eine einfache Lösung für einfachere Fälle bereitzustellen. Siehe auch die Änderungen in der Antwort von VonC für alternative Lösungen für den Fall, dass Sie einen komplexeren Fall zur Hand haben.


4
Mit .gitattributesist richtig eingerichtet, um die gewünschten Dateien zu verfolgen, diese Lösung hat wunderbar funktioniert. Viel einfacher als einige der anderen veröffentlichten Lösungen.
Josh Rickert

Das hat wunderbar funktioniert. Sollte als die wahre Antwort aufgeführt werden.
Aditya

1
arbeitete für mich in '18. Tipp für andere: 'Dateityp' war '**. jpg'
Oligofren

2
@OlliNiskanen Obwohl es erfreulich ist, als akzeptierte Antwort markiert zu werden, halte ich es für wichtig zu beachten, dass dies zwar eine gute und einfache Lösung für die gestellte spezifische Frage ist, die Leser jedoch in komplexeren Fällen die in den Änderungen von vorgeschlagenen Vorschläge für die Stapelverarbeitung konsultieren sollten tstephens619 und ttaylorr auf VonCs Antwort.
Mred

1
@mred, einverstanden. Ich habe eine Bearbeitung vorgeschlagen, die auf die zuvor akzeptierte Antwort verweist. Diese Antwort war ziemlich begraben und die Leute fanden sie hilfreich, daher denke ich, dass dies das erste sein sollte, was Besucher sehen.
Olli Niskanen

32

In Ausgabe 641 wird dasselbe Problem erwähnt.

Ich habe versucht , Git LFS mehr zu verwenden, fand aber keinen Weg , um meine vorherigen getrackten Pointer - Dateien mit zurückzukehren git lfs uninit, git lfs untrack, git rm... , nachdem ich diese Dateien verschieben Sie es Listen noch zurück , als mit von Git LFS verfolgt git lfs ls-files, wie kann ich das ganze Git LFS Opt - out Sachen aus meinem Repo?

Die Antwort war:

  1. Entfernen Sie alle filter.lfs. * Git-Konfigurationseinträge mit git lfs uninit.
  2. Löschen Sie alle Attribute, in denen der lfs-Filter verwendet wird, .gitattributesindem Sie sie git lfs untrackfür jeden Dateityp ausführen oder löschen, .gitattributeswenn Sie nur LFS verwendet haben.

Danach werden alle hinzugefügten Dateien direkt an git gesendet.

Das war aber nicht so einfach:

Ich .git/lfslande später LFS-Zeigerdateien in meinem Arbeitsverzeichnis und muss alle meine Bilder wiederherstellen, indem ich den in diesen Zeigern gespeicherten sha1-Hash manuell verwende.


Update März 2016, die Ausgabe 957 zeigt eine mögliche Lösung durch tstephens619:

Ich habe den gleichen Fehler gemacht, als ich mehrere kleine Grafikformate in meine git lfsTracking-Liste aufgenommen habe.
Ich konnte diese Dateien wie folgt wieder in Git verschieben:

  • Erstellen Sie eine Liste aller Dateien, die derzeit von verfolgt werden git-lfs, filtern Sie heraus *.gzund *.rpm(ich möchte diese Erweiterungen weiterhin mit verfolgen git-lfs)

    git lfs ls-files | grep -vE "\.gz|\.rpm$" | cut -d ' ' -f 3 > ~/temp/lfs-files.txt
    
  • Hören Sie auf, die kleinen Grafikdateien zu verfolgen

    git lfs untrack "*.tts"
    git lfs untrack "*.bfx"
    git lfs untrack "*.ttf"
    git lfs untrack "*.xcf"
    git lfs untrack "*.pkm"
    git lfs untrack "*.png"
    
  • Vorübergehend uninit git-lfs

    git lfs uninit
    # Git LFS 2.x+
    git lfs uninstall
    
  • Verwenden Sie die Dateiliste, um jede Datei zu berühren:

    cat ~/temp/lfs-files.txt | xargs touch
    

git status zeigt nun jede Datei als geändert an

  • Fügen Sie die Änderungen zum Git-Index hinzu (ich habe dies über getan git gui)

  • Übernehmen Sie die Änderungen und starten Sie git-lfs erneut

    git commit
    git lfs init
    

Der Betreuerttaylorr fügt hinzu:

Ein Weg, dies zu tun, wäre:

for file in $FILES_TO_REVERT; do
  git lfs untrack "$file";
  git rm --cached "$file";
  git add --force "$file";
done

git commit -m "..."

Ich würde es vorziehen, Git LFS keinen Befehl zu dem oben genannten Effekt hinzuzufügen, da dies mit den von Git und Git LFS bereitgestellten Porzellanbefehlen auf verschiedene Weise möglich ist


3
Vielen Dank, dass Sie das richtige Problem aus dem Projekt gefunden haben. Selbst für diese Lösung müssen die Dateien manuell verschoben werden. Scheint seltsam, wenn der Workflow von Git zu Git LFS im Grunde genommen git rm --cached <file>-> git add <file>-> ist git commit, solange Sie das Tracking korrekt eingerichtet haben.
Olli Niskanen

@Klipi Ich stimme zu: Es scheint, dass das Untrack-Szenario immer noch perfekt ist.
VonC

@Klipi Guter Anruf. Ich werde es überwachen.
VonC

2
Meine Version von LFS (2.0.2) hat keinen uninitBefehl. Stattdessen musste git lfs uninitich verwenden git lfs uninstall.
Endavid

29

Ab Git 2.16 (veröffentlicht am 17. Januar 2018) können Sie dies problemlos mit der --renormalizeFlagge von git add:

git lfs untrack '<pattern>'
git add --renormalize .
git commit -m 'Restore file contents that were previously in LFS'

Aus Gits Dokumentation :

--renormalize : Wenden Sie den "Bereinigungs" -Prozess frisch auf alle nachverfolgten Dateien an, um sie zwangsweise erneut zum Index hinzuzufügen. Dies ist nützlich, nachdem Sie die core.autocrlfKonfiguration oder das textAttribut geändert haben, um Dateien zu korrigieren, die mit falschen CRLF / LF-Zeilenenden hinzugefügt wurden. Diese Option impliziert -u.

Der Schlüsselteil hier ist "alle verfolgten Dateien". Normalerweise werden Filter nur ausgeführt, wenn eine Git-Operation eine Datei im Arbeitsbaum ändert. Das Ändern der LFS-Whitelist .gitattributesist keine Git-Operation, sodass der Index nach der Ausführung in einem inkonsistenten Zustand endet git lfs untrack. Durch Ausführen git add --renormalize .wird Git angewiesen, Filter für jede Datei im Repository erneut auszuführen, wodurch sichergestellt wird, dass alle Dateien, die sich in LFS befinden sollten, vorhanden sind - und dass alle Dateien, die nicht vorhanden sein sollten, nicht vorhanden sind.


1
Das Gute an dieser Methode ist, dass, wenn Sie aus der Vergangenheit oder einem anderen Zweig auschecken, das alte lfs-Zeug immer noch da ist. Aber in Zukunft wird lfs nicht mehr verwendet. Das einzige, was ich hinzufügen möchte, ist, das lfs-Zeug jetzt aus .gitattributes zu entfernen (oder in meinem Fall die gesamte Datei zu löschen) und dies auch einzuchecken.
David Casper

1
Es sollte beachtet werden, dass dies den Verlauf nicht ändert. Wenn Sie also ein älteres Commit auschecken, erhalten Sie möglicherweise Zeiger auf LFS anstelle der tatsächlichen Dateien. Und wenn Sie seitdem das Repo verschoben oder das LFS gelöscht haben, erhalten Sie diese alten großen Dateien nicht auf diese Weise zurück.
Thomas Tempelmann

2

Ich hatte Probleme beim Ausführen von Schritten in Windows. Um alle von git lfs verfolgten Dateien zu entfernen und die Originaldatei wiederherzustellen, habe ich in git bash Folgendes getan:

  1. .Gitattributes entfernt

  2. git lfs ls-files | cut -d ' ' -f 3 > lfs-files.txt

  3. Führen Sie das folgende Snippet aus:

Snippet:

while read file; do
  git lfs untrack "$file";
  git rm --cached "$file";
  git add --force "$file";
done <lfs-files.txt

-3

Sie können nichts wirklich aus GIT LFS entfernen, und obwohl die hier vorgestellten Lösungen möglicherweise (mit Änderungen) funktionieren, erfordern sie viel Aufwand und können Nebenwirkungen auf Ihr Repository haben.

Wenn Sie hier angekommen sind, sollten Sie sich fragen, ob Sie Ihre großen Dateien mit GIF LFS verwalten möchten und ob GIT selbst (das bei der Verwaltung großer Dateien von Natur aus schlecht ist, da es sich um ein verteiltes Versionskontrollsystem handelt) eine gute Wahl war.

Wenn Sie viele große Dateien haben und eine einzelne Organisation sind, die an Ihrem Projekt arbeitet, funktioniert Subversion möglicherweise besser für Sie.


2
@ericfrazer Jeder einzelne Besuch dieser Frage beweist meinen Standpunkt, da das Entfernen von Dateien aus LFS gemäß der offiziellen Dokumentation von GIT LFS ein Kinderspiel sein sollte. Außer es ist nicht, weil es nicht funktioniert. Menschen haben Probleme, weil a) es schwierig ist, die hinzuzufügenden Dateien zu optimieren und b) viele kleine Dateien hinzuzufügen, was unter Windows zu Leistungsproblemen führt, da GIT LFS als Unterprozess ausgeführt wird und das Starten von Unterprozessen ohne teuer ist Gabel(). Fazit: Verwenden Sie für Ihre eigene geistige Gesundheit keine LFS, bevor dies alles behoben ist. Was seit Jahren nicht mehr passiert ist ...
Florian Winter
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.