Mam 300 MB repozytorium git. Całkowity rozmiar moich obecnie wyrejestrowanych plików wynosi 2 MB, a całkowity rozmiar reszty repozytorium git wynosi 298 MB. Jest to w zasadzie repozytorium tylko do kodu, które nie powinno przekraczać kilku MB.
Podejrzewam, że ktoś przypadkowo popełnił kilka dużych plików (wideo, obrazy itp.), A następnie usunął je ... ale nie z git, więc historia wciąż zawiera bezużyteczne duże pliki. Jak znaleźć duże pliki w historii git? Jest ponad 400 zatwierdzeń, więc przejście jeden po drugim nie jest praktyczne.
UWAGA : moje pytanie nie dotyczy tego, jak usunąć plik , ale jak go znaleźć .
Odpowiedzi:
W przeszłości ten skrypt był bardzo przydatny do znajdowania dużych (i nieoczywistych) obiektów w repozytorium git:
To da ci nazwę obiektu (SHA1sum) obiektu blob, a następnie możesz użyć skryptu takiego jak ten:
... aby znaleźć zatwierdzenie wskazujące na każdy z tych obiektów blob.
źródło
B Niesamowicie szybka, jednoczęściowa skorupa 🚀
Ten skrypt powłoki wyświetla wszystkie obiekty obiektów blob w repozytorium, posortowane od najmniejszych do największych.
W przypadku mojej próbki repozytorium działało około 100 razy szybciej niż inne znalezione tutaj.
W moim zaufanym systemie Athlon II X4 obsługuje repozytorium jądra systemu Linux z 5,6 milionami obiektów w nieco ponad minutę .
Skrypt podstawowy
Gdy uruchomisz powyżej kodu, uzyskasz ładne, czytelne dla człowieka dane wyjściowe, takie jak to:
Użytkownicy systemu macOS : ponieważ
numfmt
nie jest on dostępny w systemie macOS, możesz albo pominąć ostatni wiersz i poradzić sobie z rozmiarami surowych bajtów, albobrew install coreutils
.Filtracja
Aby uzyskać dalsze filtrowanie , wstaw jedną z poniższych linii przed
sort
linią .Aby wykluczyć pliki, które są obecne
HEAD
, wstaw następujący wiersz:Aby wyświetlić tylko pliki przekraczające podany rozmiar (np. 1 MiB = 2 20 B), wstaw następujący wiersz:
Wyjście dla komputerów
Aby wygenerować dane wyjściowe bardziej odpowiednie do dalszego przetwarzania przez komputery, pomiń dwa ostatnie wiersze skryptu podstawowego. Robią całe formatowanie. To pozostawi Ci coś takiego:
Usuwanie pliku
W celu rzeczywistego usunięcia pliku sprawdź to SO pytanie na ten temat .
źródło
brew install coreutils
, a następnie zastąpićcut
zgcut
inumfmt
zgnumfmt
.git large
ktoś?Znalazłem jedno-liniowe rozwiązanie na stronie wiki ETH Zurich Department of Physics (blisko końca tej strony). Po prostu zrób,
git gc
aby usunąć nieaktualne śmieci, a następnieda ci 10 największych plików w repozytorium.
Teraz dostępne jest również leniwe rozwiązanie, GitExtensions ma teraz wtyczkę, która robi to w interfejsie użytkownika (i obsługuje również przepisywanie historii).
źródło
git rev-list --objects --all | grep -E `git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -10 | awk '{print$1}' | sed ':a;N;$!ba;s/\n/|/g'`
Krok 1 Zapisz wszystkie pliki SHA1 do pliku tekstowego:
Krok 2 Posortuj obiekty BLOB od największej do najmniejszej i zapisz wyniki w pliku tekstowym:
Krok 3a Połącz oba pliki tekstowe, aby uzyskać informacje o nazwie / sha1 / rozmiarze:
Krok 3b Jeśli masz nazwy plików lub ścieżki zawierające spacje, wypróbuj tę odmianę kroku 3a. Używa
cut
zamiast,awk
aby uzyskać pożądane kolumny, w tym. spacje od kolumny 7 do końca wiersza:Teraz możesz spojrzeć na plik bigtosmall.txt, aby zdecydować, które pliki chcesz usunąć z historii Git.
Krok 4 Aby wykonać usunięcie (zwróć uwagę, że ta część jest powolna, ponieważ będzie sprawdzać każde zatwierdzenie w twojej historii pod kątem danych o zidentyfikowanym pliku):
Źródło
Kroki 1-3a zostały skopiowane ze znajdowania i usuwania dużych plików z historii Git
EDYTOWAĆ
Artykuł został usunięty kiedyś w drugiej połowie 2017 r., Ale nadal można uzyskać do niego zarchiwizowaną kopię za pomocą Wayback Machine .
źródło
git gc && join -e ERROR -a 2 -j 1 -o 2.1,2.3,1.2 --check-order <( git rev-list --objects --all | sort -k 1 ) <( git verify-pack -v .git/objects/pack/pack-*.idx | gawk '( NF == 5 && $2 == "blob" ){print}' | sort -k1 ) | sort -k2gr
join -t' ' -e ERROR -a 2 -j 1 -o 2.1,2.3,1.2 --check-order <( git rev-list --objects --all | sed 's/[[:space:]]/\t/' | sort -k 1 ) <( git verify-pack -v .git/objects/pack/pack-*.idx | gawk '( NF == 5 && $2 == "blob" ){print}' | sort -k1 | sed 's/[[:space:]]\+/\t/g' ) | sort -k2gr | less
. Pamiętaj, że musisz wpisać rzeczywisty znak TAB pojoin -t'
CTRL + V <TAB> na geekbraindump.blogspot.ru/2009/04/unix-join-with-tabs.html$'\t'
powinien dać ci zakładkę.echo -n $'\t' | xxd -ps
->09
Powinieneś użyć BFG Repo-Cleaner .
Według strony internetowej:
Klasyczna procedura zmniejszania rozmiaru repozytorium to:
źródło
--strip-biggest-blobs 500
zrobić?Jeśli chcesz mieć tylko listę dużych plików, chciałbym przedstawić Ci następującą linijkę:
Czyj wynik będzie:
Ostatni wpis na liście wskazuje na największy plik w historii git.
Możesz użyć tego wyjścia, aby upewnić się, że nie usuwasz rzeczy z BFG , których potrzebowałbyś w swojej historii.
źródło
1.1, 1.2, 2.3
liczby?<filenumber>.<field>
określającą kolejność kombinacji. Aby uzyskać więcej informacji, zobacz man.cx/join .Jeśli korzystasz z systemu Windows, oto skrypt PowerShell, który wydrukuje 10 największych plików w twoim repozytorium:
źródło
You cannot call a method on a null-valued expression. At line: 2 char: 1
. Jednak ta odpowiedź zadziałała: stackoverflow.com/a/57793716/2441655 (jest również krótsza)Spróbować
git ls-files | xargs du -hs --threshold=1M
.Używamy poniższego polecenia w naszym potoku CI, zatrzymuje się, jeśli znajdzie jakieś duże pliki w repozytorium git:
źródło
Nie mogłem skorzystać z najpopularniejszej odpowiedzi, ponieważ
--batch-check
przełącznik wiersza poleceń do Git 1.8.3 (z którego muszę korzystać) nie przyjmuje żadnych argumentów. Kolejne kroki zostały wypróbowane na CentOS 6.5 z Bash 4.1.2Kluczowe idee
W Git termin „ kropelka” oznacza zawartość pliku. Zauważ, że zatwierdzenie może zmienić zawartość pliku lub nazwy ścieżki. Zatem ten sam plik może odnosić się do innego obiektu blob w zależności od zatwierdzenia. Pewny plik może być największy w hierarchii katalogów w jednym zatwierdzeniu, a nie w innym. Dlatego kwestia znalezienia dużych zatwierdzeń zamiast dużych plików stawia sprawy we właściwej perspektywie.
Dla niecierpliwych
Polecenie drukowania listy obiektów blob w malejącej kolejności wielkości to:
Przykładowe dane wyjściowe:
Aby usunąć takie obiekty BLOB, użyj BFG Repo Cleaner , jak wspomniano w innych odpowiedziach. Biorąc pod uwagę plik,
blobs.txt
który zawiera tylko skróty obiektów blob, na przykład:Zrobić:
Pytanie dotyczy znalezienia zatwierdzeń, co jest więcej pracy niż znalezienie obiektów blob. Aby wiedzieć, czytaj dalej.
Dalsza praca
Biorąc pod uwagę skrót zatwierdzenia, polecenie, które drukuje skróty wszystkich powiązanych z nim obiektów, w tym obiektów blob, to:
Tak więc, jeśli mamy takie wyjścia dostępne dla wszystkich zatwierdzeń w repozytorium, to biorąc pod uwagę skrót obiektu blob, wiązka zatwierdzeń to te, które pasują do któregokolwiek z wyników. Ta idea jest zakodowana w następującym skrypcie:
Jeśli zawartość zostanie zapisana w pliku o nazwie,
find-commits.sh
typowe wywołanie będzie wyglądać tak:Podobnie jak wcześniej, plik
blobs.txt
zawiera skróty obiektów blob, po jednym w wierszu.create_db()
Funkcja oszczędza pamięć podręczna wszystkim popełnić ofert w podkatalogu w katalogu bieżącym.Niektóre statystyki z moich eksperymentów na systemie z dwoma procesorami Intel (R) Xeon (E) E5-2620 2,00 GHz, przedstawionymi przez system operacyjny jako 24 rdzenie wirtualne:
Zauważ, że skrypt jest jednowątkowy. Dlatego tylko jeden rdzeń byłby używany w tym samym czasie.
źródło
Rozwiązanie PowerShell dla Windows Git, znajdź największe pliki:
źródło
Zacznij od analizy, walidacji i wyboru podstawowej przyczyny. Użyj,
git-repo-analysis
aby pomóc.Możesz również znaleźć pewną wartość w szczegółowych raportach generowanych przez BFG Repo-Cleaner , które można uruchomić bardzo szybko poprzez klonowanie do kropli Digital Ocean przy użyciu przepustowości sieci 10 Mb / s.
źródło
Natknąłem się na to z tego samego powodu, co inni. Ale cytowane skrypty nie działały dla mnie. Zrobiłem taki, który jest bardziej hybrydą tych, które widziałem i teraz żyje tutaj - https://gitlab.com/inorton/git-size-calc
źródło