Moja obecna baza ma łączną wielkość ok. 200MB.
Ale mój folder .git ma niesamowity rozmiar 5 GB (!). Odkąd wypycham swoją pracę na serwer zewnętrzny, nie potrzebuję dużej lokalnej historii ...
Jak mogę zmniejszyć folder .git, aby zwolnić miejsce na moim notebooku? Czy mogę usunąć wszystkie zmiany starsze niż 30 dni?
bardzo dziękuję za pomoc :)
git count-objects -v
?Odpowiedzi:
nie powinieneś usuwać wszystkich zmian starszych niż 30 dni (myślę, że jest to w jakiś sposób możliwe wykorzystanie gita, ale naprawdę nie jest zalecane).
możesz zadzwonić
git gc --aggressive --prune
, co dokona czyszczenia pamięci w repozytorium i usunie stare obiekty. czy masz dużo plików binarnych (archiwa, obrazy, pliki wykonywalne), które często się zmieniają? te zwykle prowadzą do ogromnych folderów .git (pamiętaj, że git przechowuje migawki dla każdej wersji, a pliki binarne źle się kompresują)źródło
git gc --aggressive
jest uważana za złą praktykę. Lepiej go używaćgit repack -a -d --depth=250 --window=250
.git gc --aggressive
wywołuje przepakowywanie z rozmiarem okna 250 (por. strona podręcznika) i głębokością 250 (por. kod źródłowy). - agresywny dodatkowo dodaje-f
przełącznik, aby wyrzucić i powtórzyć wszystkie poprzednie operacje delta (jak również wspomniano w linku)git gc --aggressive --prune
zmniejszyło to do 19 MB.--prune
nie jest również konieczne, ponieważ stało się to domyślne od czasuv1.5.5-rc0
(zatwierdzenie 25ee973 , marzec 2008).Oto, co twórca git Linus ma do powiedzenia na temat zmniejszania repozytorium git:
źródło: http://gcc.gnu.org/ml/gcc/2007-12/msg00165.html
Czy to pozbędzie się danych binarnych, które są osierocone w moim repozytorium? „git repack” nie usunie obrazów ani danych binarnych, które wpisałeś do repozytorium, a następnie usunąłeś. Aby trwale usunąć tego rodzaju dane z repozytorium, musisz ponownie zapisać historię. Typowym tego przykładem jest przypadkowe sprawdzenie haseł w git. Możesz cofnąć się i usunąć niektóre pliki, ale wtedy musisz ponownie zapisać swoją historię od tego czasu do teraz, a następnie wymusić wypchnięcie nowego repozytorium do źródła.
źródło
fatal: Out of memory, malloc failed (tried to allocate 39763130 bytes)
repack
lokalnie, wykonaniu zatwierdzenia i wypchnięcia, zmniejszanie będzie również zdalne?Wypróbowałem te, ale moje repozytorium było nadal bardzo duże. Problem polegał na tym, że przypadkowo wpisałem niektóre wygenerowane duże pliki. Po kilku poszukiwaniach znalazłem świetny tutorial, który ułatwia usuwanie dużych wygenerowanych plików. Ten samouczek pozwolił mi zmniejszyć moje repozytorium z 60 MB do <1 MB.
źródło
5 GB w porównaniu z 200 MB to trochę dziwne. Spróbuj biec
git gc
.Ale nie, jeśli nie podzielisz repozytorium na moduły, nie możesz zmniejszyć rozmiaru
.git
katalogu.Każdy klon repozytorium git jest pełnoprawnym repozytorium, które może działać jako serwer. To podstawowa zasada rozproszonej kontroli wersji.
źródło
Używam git bardziej jako mechanizmu synchronizacji niż do historii wersji. Więc moim rozwiązaniem tego problemu było upewnienie się, że wszystkie moje obecne źródła są w zadowalającym stanie, a następnie po prostu usuń .git i ponownie zainicjuj repozytoria. Rozwiązany problem z miejscem na dysku. :-) Historia minęła :-( Robię to, ponieważ moje repozytorium jest na małym kluczu USB. Nie chcę ani nie potrzebuję całej mojej historii. Gdybym miał metodę na skracanie historii, użyłbym tego.
Gdybym był zainteresowany zachowaniem mojej historii, zarchiwizowałbym bieżące repozytorium. W pewnym momencie później mogłem sklonować oryginalne repozytorium, skopiować wszystkie zmiany z nowego repozytorium (załóżmy, że nie zrobiłem zbyt wiele (żadnej) zmiany nazwy lub usunięcia). Następnie wykonaj jedno duże zatwierdzenie, które będzie reprezentowało wszystkie zmiany wprowadzone w nowym repozytorium jako pojedyncze zatwierdzenie w starym repozytorium. Czy można połączyć historie? Może gdybym użył gałęzi, a potem usunął niepotrzebne obiekty. (Nie wiem wystarczająco dużo o wewnętrznych elementach gita, żeby zacząć się tak wygłupiać).
źródło
Wypróbowałem powyższe metody, nic nie działało w moim przypadku (gdzie przypadkowo zabiłem proces git podczas git push), więc w końcu musiałem usunąć repozytorium i sklonować je ponownie, a teraz folder .git ma normalny rozmiar.
źródło
Napotkałem ten sam problem na moim komputerze lokalnym. Powodem było to, że usunąłem kilka ogromnych plików z mojego lokalnego i przekazałem je do centralnego repozytorium. Ale zdarzenie po
git status
,git fetch
igit pull
..git
Rozmiar mojego folderu to około 3 GB. później uruchomiłem następujące polecenie, aby zmniejszyć rozmiar.git
folderu, biorąc pod uwagę pliki, które zmieniły się / wygasły miesiąc temu.Komenda
Git
Polecenia i ich krótki opis:git-prune
- Usuń wszystkie niedostępne obiekty z bazy danych obiektówgit-repack
- Spakuj rozpakowane obiekty do repozytoriumgit-prune-packed
- Usuń dodatkowe obiekty, które są już w plikach paczek.git reflog
: Git śledzi aktualizacje końcówek gałęzi za pomocą mechanizmu zwanego dziennikami referencyjnymi lub „reflogami”. Reflogs śledzi, kiedy odniesienia Git zostały zaktualizowane w lokalnym repozytorium. Oprócz reflogów końcówek gałęzi, utrzymywany jest specjalny reflog dla skrytki Gita. Reflogi są przechowywane w katalogach w katalogu lokalnego repozytorium.git
. Katalogi git reflog można znaleźć pod adresem.git/logs/refs/heads/.
,.git/logs/HEAD
a także,.git/logs/refs/stash
jeśli w repozytorium użyto skrytki git. git reflog na wysokim poziomie naRewriting History
stronie.git reflog expire --expire=now --expire-unreachable=now --all
Oprócz zachowywania historii w reflogu, Git ma wewnętrzne daty wygaśnięcia, kiedy będzie przycinał odłączone zatwierdzenia. Ponownie, są to wszystkie szczegóły implementacji, które
git gc
obsługują igit prune
nie powinny być używane samodzielnie.git gc --aggressive
: git-gc - wyczyść niepotrzebne pliki i zoptymalizuj lokalne repozytorium.W tle git gc faktycznie wykonuje pakiet innych wewnętrznych komend, takich jak
git prune, git repack, git pack and git rerere
. Głównym obowiązkiem tych komend jest zidentyfikowanie wszystkich obiektów Git, które są poza poziomami progowymi ustawionymi wgit gc
konfiguracji. Po zidentyfikowaniu obiekty te są następnie kompresowane lub odpowiednio przycinane.Zwykłe z wynikiem:
źródło