2012-05-18 3 views
17

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ß?

+0

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

+0

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'). –

+0

@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

Antwort

7

Nach einer neuen Kopie des Repository klonen, konnte ich die Befehle genau, wie oben ausgeführt, und erreichen das gewünschte Ergebnis: My .git Verzeichnis von 205 MB bis zu 20 MB reduziert wurde, und die große FLV Dateien wurden sauber aus der Packdatei entfernt.

Der erste Versuch wurde auch auf einem frischen Klon durchgeführt, auf die ich keine Änderungen vorgenommen hatte, so habe ich keine befriedigende Erklärung dafür, warum die FLV-Dateien im Innern des Packfile zum Verweilen fortgesetzt.

Ich reichte ursprünglich die unten Antwort und dachte, dass ich durch Laufen git repack -a ein Problem verursacht hatte, bevor .git/refs/original Entfernen Sie die Original-Refs verursacht verpackt zu werden, so dass, wenn ich .git/refs/original keine Wirkung war es entfernt hat; Meine ursprünglichen Refs würden immer noch auf die großen FLV-Dateien verweisen. Dies scheint jedoch nicht zu bestehen. Ausführen der obigen Befehle auf einer frisch geklonten Kopie des Repository mit dem Zusatz von git repack -a unmittelbar nach git filter-branch scheint nicht das Ergebnis zu beeinflussen - die FLV-Dateien werden nach wie vor von der Packfile gespült. Ich habe keinen Grund zu der Annahme, dass dies für das ursprüngliche Problem relevant ist.


Gibt es eine andere Art und Weise, dass git speichert Refs, dass ich nicht über sie wissen?

Es gibt. Es stellt sich heraus, dass ich nicht ganz ehrlich über die Reihenfolge der oben aufgeführten Befehle bin. Ich hatte git repack -avor läuft rm -rf .git/refs/original laufen, und Git die Refs weggepackt hatte (zu bestimmen, wo, zu experimentieren jetzt). Als ich dann rm -rf .git/refs/original lief, wurde nichts entfernt. git gc konnte mein Packfile schrumpfen, weil ich tat noch Verweise auf die alten Dateien verweilenden aufgrund der gepackten refs/original Refs haben.

+0

In Bezug auf, wo verpackt Refs gehen, siehe '.git/gepackten refs' – twalberg

+4

Könnten Sie die genauen Schritte zusammenfassen Sie nehmen schließlich, um in der Antwort? Ich habe ein ähnliches Problem, und ich möchte versuchen, es zu beheben. –

Verwandte Themen