2012-05-18 12 views
17

Przepisałem historię mojego repozytorium, aby usunąć niektóre duże pliki FLV za pomocą git filter-branch. I przede wszystkim po artykuł artykułu Github na removing sensitive data i podobne instrukcje znaleźć gdzie indziej w Internecie:Dlaczego duże pliki wciąż istnieją w moim pliku pack, po wyszorowaniu ich za pomocą gałęzi filtru?

Zdejmowanie dużą FLVs:

git filter-branch --index-filter 'git rm --cached --ignore-unmatch public/video/*.flv' --prune-empty -- --all 

Usuwanie oryginalne pozycje literaturowe:

Usuwanie z reflog:

git reflog expire --expire=now --all 

Przycinanie nieosiągalnych obiektów:

git gc --prune=now 

Aggressivly przycinanie nieosiągalne obiekty:

git gc --aggressive --prune=now 

dotycząca pakowania rzeczy:

git repack -A -d 

A moja gitdir nadal jest 205 MB, zawierała prawie w całości w jednym packfile:

$ du -h .git/objects/pack/* 
284K .git/objects/pack/pack-f72ed7cee1206aae9a7a3eaf75741a9137e5a2fe.idx 
204M .git/objects/pack/pack-f72ed7cee1206aae9a7a3eaf75741a9137e5a2fe.pack 

Stosując this script, można zobaczyć, że pliki FLV usunęliśmy są jeszcze zawarte w opakowaniu:

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 
.... 

Klonowanie repozytorium przy git clone --bare my-repo wydajnością my-repo.git który również 205MB wielkości.

Co mogę zrobić, aby usunąć te (prawdopodobnie) nie odwoływane obiekty z paczki i zmniejszyć moje repozytorium z powrotem do rozmiaru, gdyby nigdy nie zostały popełnione? Jeśli są one w jakiś sposób przywoływane, czy istnieje sposób, aby powiedzieć, gdzie?

Aktualizacja

Po próbując ponownie uruchomić git filter-branch dostałam niniejszego ogłoszenia:

Cannot create a new backup. 
A previous backup already exists in refs/original/ 
Force overwriting the backup with -f 

I sprawdzeniu, że nie było żadnychbibl w .git/refs/original rzeczywiście katalog nie w ogóle istnieje. Czy jest jakiś inny sposób, w jaki git przechowuje dane, o których nie wiem?

+0

Klonowanie repozytorium za pomocą 'git clone --bare my-repo' daje' moje-repo.git' które również ma rozmiar 205MB, więc nie; plik pakietu i jego ogromna zawartość pochodzą z klonem. – meagar

+0

Twoja skasowana odpowiedź jest interesująca i może być przydatna dla innych osób - czy rozważałbyś edytowanie swojego pytania w celu opisania prawdziwej kolejności poleceń, które zrobiłeś, a następnie przesłanie odpowiedzi wyjaśniającej o pakowaniu refs/original? (Jest to subtelny punkt, w którym możesz mieć odniesienia, które istnieją tylko w plikach pakietów, a nie w pliku pod 'refs'.) –

+0

@MarkLongair Nadal bawię się, próbując odtworzyć wyniki z usuniętej odpowiedzi. Sklonowałem repozytorium i odkryłem, że uruchomienie 'git repack -a' * przed * uruchomieniem' rm -rf .git/refs/original' nie ** nie wpływa na wynik. Wydaje się, że nie ma to wpływu na zawartość '.git/refs/original'. – meagar

Odpowiedz

7

Po skopiowaniu nowej kopii repozytorium, udało mi się uruchomić komendy dokładnie tak, jak powyżej, i osiągnąć pożądany wynik: Mój katalog .git został zmniejszony z 205 MB do 20 MB, a duży FLV pliki zostały usunięte z pliku packfile.

Pierwsza próba została również wykonana na świeżym klonie, do którego nie wprowadziłem żadnych modyfikacji, więc nie mam zadowalającego wyjaśnienia, dlaczego pliki FLV pozostawały w pliku pakietu.

ja pierwotnie przedstawiony poniżej odpowiedź, myśląc, że ja spowodowane problemem uruchamiając git repack -a przed wyjęciem .git/refs/original, powodując oryginalne bibl zostać zapakowane tak, że kiedy nie usunąć .git/refs/original nie było żadnego efektu; moje oryginalne referencje nadal odwoływałyby się do dużych plików FLV. Jednak wydaje się, że to nie wytrzymuje. Uruchomienie powyższych poleceń na świeżo sklonowanej kopii repozytorium z dodaniem git repack -a natychmiast po git filter-branch nie wydaje się wpływać na wynik - pliki FLV są nadal usuwane z pliku packfile. Nie mam powodu, aby sądzić, że jest to istotne dla pierwotnego problemu.


Czy istnieje jakiś inny sposób, który przechowuje git bibl, że nie wiem o?

Istnieje. Okazuje się, że nie byłem całkowicie zgodny z porządkiem poleceń wymienionych powyżej. Przed wykonaniem podłączyłem się, a Git odłożył odłamki (aby ustalić, gdzie, teraz eksperymentować). Po uruchomieniu rm -rf .git/refs/original nic nie zostało usunięte. git gc nie mogłem zmniejszyć mojego pliku paczki, ponieważ I wykonał, nadal posiadając trwałe odniesienia do starych plików ze względu na spakowane numery refs/original.

+0

Odnosząc się do miejsca, w którym znajdował się pakowany list polecający, zobacz '.git/packed-refs' – twalberg

+4

Czy mógłbyś podsumować dokładne kroki, które wykonałeś, w kolejności, w odpowiedzi? Mam podobny problem i chciałbym spróbować go naprawić. –

Powiązane problemy