Mamy repozytorium git zawierające kod źródłowy i pliki binarne. Nagie repo osiągnęło teraz około 9 GB, a klonowanie trwa wieki. Większość czasu spędza się w "remote: Compressing objects". Po zatwierdzeniu nowej wersji jednego z większych plików binarnych pobieranie trwa długo, a także zajmuje się kompresją obiektów na serwerze.Naprawianie repozytorium git spowolnionego z powodu dużych plików binarnych
Po lekturze git pull without remotely compressing objects podejrzewam, że kompresja plików binarnych jest również bolesna, ale nie jestem w 100% pewna, jak to naprawić.
Jakie są dokładne kroki, aby naprawić nagie transakcje repo na serwerze? Zgaduję:
- Dodaj wpisy jak '* .zip -delta' dla wszystkich rozszerzeń chcę do .git/info/atrybuty
- Uruchom 'git repack', ale jakie opcje? Czy -adF zapakuje wszystko i zostawi mnie z repozytorium, w którym kompresja delta nie została kiedykolwiek wykonana dla określonych typów plików?
- Uruchom "git prune". Pomyślałem, że zrobiono to automatycznie, ale uruchomienie go, gdy grałem z gołym klonem repo, zmniejszyło rozmiar o ~ 2 GB.
- Klonowanie repozytorium, dodawanie i zatwierdzanie .gitattributes z tymi samymi wpisami, które dodałem w .git/info/atrybuty na gołym repo
Mam coś?
Aktualizacja:
Ciekawe wyniki badań na ten temat. Dzisiaj rozpocząłem nagły klon problematycznego repozytorium. Nasz nie tak potężny serwer z 4-bitowym ramkiem zabrakło pamięci i zaczął się wymieniać. Po 3 godzinach poddaję się ...
Potem sklonowałem nagi repozytorium z mojej aktualnej kopii roboczej. Klonowanie tego między stacjami zajęło ~ 5 minut. Następnie przekazałem go na serwer jako nowe repozytorium. Klonowanie repozytorium trwało tylko 7 minut.
Jeśli poprawnie zinterpretuję to, lepiej zapakowane repo działa o wiele lepiej, nawet bez wyłączania kompresji delta dla plików binarnych. Myślę, że oznacza to, że powyższe kroki są rzeczywiście tym, co chcę zrobić w krótkim czasie, ale dodatkowo muszę się dowiedzieć, jak ograniczyć ilość pamięci git, którą można użyć do pakowania/kompresji na serwerze, aby uniknąć zamiana.
Jeśli jest to ważne: serwer uruchamia git 1.7.0.4, a stacje robocze działają 1.7.9.5.
Aktualizacja 2:
zrobiłem następujące kroki na moim testrepo i myślę, że będzie okazja, aby zrobić je na serwerze (po kopii zapasowej)
wykorzystanie pamięci Limit przy pakowaniu obiektów
git config pack.windowMemory 100m
git config pakiet.packSizeLimit 200mwyłączyć kompresję delta dla niektórych rozszerzeń
echo '* .tar.gz -delta' >> Info/atrybuty
echo '* .tar.bz2 -delta' >> info/atrybuty
echo '* .bin -delta' >> info/atrybuty
echo '* .png -delta' >> info/atrybutyRepack repozytorium zbierania śmieci
git repack -a-D-F --window pamięć 100 --max sztuk wielkości 200
git GC
Aktualizacja 3:
Niektóre nieoczekiwane efekty uboczne po tej operacji: Issues after trying to repack a git repo for improved performance
przechowywanie plików binarnych w innym miejscu byłoby opcją? Git naprawdę jest do bani z dużymi binarkami, co zostało potwierdzone. Dlatego są [oddzielne] (http://caca.zoy.org/wiki/git-bigfiles) [produkty] (http://git-annex.branchable.com/) za to ... – eis
Kiedy zaczynając od gita, dodaliśmy pliki binarne uC, nasze rootfs i toolchain, aby móc uzyskać pełną migawkę z przeszłości, po prostu sprawdzając wersję git. Nie wiedzieliśmy wystarczająco dużo o git, żeby przewidzieć powolność. Mam zamiar naprawić to poprawnie (patrząc na git-ankietę, ale nie wiedziałem o git-bigfiles), ale jako rozwiązanie krótkoterminowe chciałbym poprawić wydajność obecnego repo najlepiej jak potrafię. – anr78
Uważam, że jego lepszą praktyką jest przechowywanie środowiska deweloperskiego/toolchain w maszynie wirtualnej (jeśli koniecznie musisz przechowywać różne wersje swojego środowiska programistycznego, po prostu zapisz nowy obraz dysku poza repozytorium). –