Ich habe den Verlauf meines Repository neu geschrieben, um einige große FLV-Dateien mit git filter-branch
zu entfernen. Ich folgte in erster Linie die Github Artikel Artikel über removing sensitive data und ähnliche Anweisungen an anderer Stelle im Internet zu finden:Warum sind in meiner Packdatei noch große Dateien vorhanden, nachdem sie mit Filter-Branch bereinigt wurden?
git filter-branch --index-filter 'git rm --cached --ignore-unmatch public/video/*.flv' --prune-empty -- --all
die Original-Refs Entfernen:
Löschen des reflog
die große FLVs ausbauen:
git reflog expire --expire=now --all
Nicht erreichbare Objekte beschneiden:
git gc --prune=now
Aggressivly Beschneidung nicht erreichbar Objekte:
git gc --aggressive --prune=now
Umpacken Dinge:
git repack -A -d
Und mein gitdir noch 205 MB, die fast vollständig in einem einzigen Packfile enthalten:
$ du -h .git/objects/pack/*
284K .git/objects/pack/pack-f72ed7cee1206aae9a7a3eaf75741a9137e5a2fe.idx
204M .git/objects/pack/pack-f72ed7cee1206aae9a7a3eaf75741a9137e5a2fe.pack
Mit this script, kann ich sehen, dass die FLVs ich entfernt habe noch in der Packung enthalten sind:
All sizes are in kB's. The pack column is the size of the object, compressed, inside the pack file.
size pack SHA location
17503 17416 1be4132fa8d91e6ce5c45caaa2757b7ea87d87b0 public/video/XXX_FINAL.flv
17348 17261 b7aa83e187112a9cfaccae9206fc356798213c06 public/video/YYY_FINAL.flv
....
Klonierung des Repository über git clone --bare my-repo
Ausbeuten my-repo.git
, die auch in der Größe 205MB ist.
Was kann ich tun, um diese (vermutlich) nicht referenzierten Objekte aus dem Paket zu entfernen und mein Repository wieder auf die Größe zu verkleinern, wäre es noch nie geschehen? Wenn sie noch irgendwie referenziert werden, gibt es eine Möglichkeit zu sagen, wo?
aktualisieren
Beim Versuch git filter-branch
erhielt ich diese Mitteilung an erneut auszuführen:
Cannot create a new backup.
A previous backup already exists in refs/original/
Force overwriting the backup with -f
ich nachgewiesen, dass es in .git/refs/original
, ja keine Refs waren, tat das Verzeichnis nicht überhaupt existieren. Gibt es einen anderen Weg, auf dem Git Refs speichert, von denen ich nichts weiß?
Klonierung des Repository über 'git clone --bare my-repo' Ausbeuten' my-repo.git', die auch in der Größe 205MB ist, so dass keine; das Paket und sein riesiger Inhalt gehören zum Klon. – meagar
Ihre gelöschte Antwort ist interessant und könnte für andere nützlich sein - würden Sie Ihre Frage bearbeiten, um die tatsächliche Reihenfolge der Befehle zu beschreiben, die Sie getan haben, und dann eine Antwort zu den refs/original's refs zurückgeben? (Es ist ein subtiler Punkt, dass Sie Referenzen haben können, die nur in Pack-Dateien existieren, und keine Datei unter 'refs'). –
@MarkLongair Ich spiele immer noch herum und versuche, die Ergebnisse meiner gelöschten Antwort zu reproduzieren. Ich habe den Repo geklont und festgestellt, dass das Ausführen von 'git repack -a' * vor dem Ausführen von' rm -rf .git/refs/original '** nicht ** das Ergebnis zu beeinflussen scheint. Es scheint den Inhalt von '.git/refs/original' nicht zu beeinflussen. – meagar