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