Zmniejsz rozmiar repozytorium git

290

Próbowałem znaleźć dobry samouczek na temat zmniejszania rozmiaru repozytorium, ale nie znalazłem. Jak zmniejszyć rozmiar repozytorium ... to około 10 MB, ale chodzi o to, że Heroku pozwala tylko na 50 MB i nie jestem blisko ukończenia tworzenia mojej aplikacji.

Dodałem już zwykłych podejrzanych (log, sprzedawca, dokument itp.) Do .gitignore. Chociaż ostatnio dodałem tylko .gitignore.

Jakieś sugestie?

sent-hil
źródło
1
Właśnie to zrobiłem i sprowadziłem go do 2,2 mb ... wielkie dzięki! Chociaż nie wydawało się to zmniejszać rozmiaru repozytorium na Heroku..hmm
wysłano
11
Wciśnij za pomocą --force. Zastąpi zawartość, nawet jeśli nie było żadnych zmian (żadnych nowych zmian itp.)
Marcin Gil
1
@MarcinGil - poniżej VonC stwierdza, że ​​potrzebujesz dostępu do serwera, aby wyczyścić zdalny serwer (jeśli poprawnie go parsuję).
jww
1
Tylko komentarz, aby pomóc innym czytelnikom, jeśli nie wiedzą, co dodać do .gitignore, gitignore.io oferuje miłą usługę, która pomoże Ci skonfigurować dobry produkt w .gitignoreoparciu o środowisko programistyczne.
Blairg23

Odpowiedzi:

352

git gc --aggressivejest jednym ze sposobów wymuszenia przeprowadzenia procesu przycinania (dla pewności:) git gc --aggressive --prune=now. Masz także inne polecenia do czyszczenia repozytorium. Nie zapominaj jednak, że czasami git gcsam może zwiększyć rozmiar repo !

Można go również użyć po filter-branch, aby zaznaczyć niektóre katalogi do usunięcia z historii (z dodatkowym zyskiem miejsca); patrz tutaj . Ale to oznacza, że ​​nikt nie korzysta z twojego publicznego repozytorium. filter-branchmoże przechowywać kopie zapasowe.git/refs/original celu umożliwienia czyszczenia katalogu.

Wreszcie, jak wspomniano w tym komentarzu i tym pytaniu ; czyszczenie reflogu może pomóc:

git reflog expire --all --expire=now
git gc --prune=now --aggressive

Jeszcze bardziej kompletnym i prawdopodobnie niebezpiecznym rozwiązaniem jest usunięcie nieużywanych obiektów z repozytorium git

VonC
źródło
W innym scenariuszu zobacz także stackoverflow.com/questions/1029969/…
VonC
1
Uwaga do siebie: nie zapomnij zdalnych gałęzi: stackoverflow.com/questions/11255802/…
VonC
1
Uwaga do siebie: nie zapomnij o zdalnych tagach
saiyancoder
1
Oprócz zdalnych referencji, rejestrowanie jest kolejną rzeczą, która może powodować, że referencje, które próbujesz usunąć, zostaną zachowane. stackoverflow.com/q/27489761/1072626
vossad01
1
@jww Potwierdzam, że jest to operacja wyłącznie lokalna. Nie ma to wpływu na rozmiar zdalnego repo. Aby zrobić to samo, potrzebujesz bezpośredniego dostępu do serwera tego zdalnego repozytorium.
VonC
94

Dziękuję za twoje odpowiedzi. Oto co zrobiłem:

git gc
git gc --aggressive
git prune

To chyba załatwiło sprawę. Zacząłem od około 10,5 MB, a teraz to niewiele więcej niż 980 KB.

sent-hil
źródło
8
prunejest zawsze uruchamiany przez gc(domyślnie 2 tygodnie temu).
Cas
117
Do tej pory możesz uruchomić wszystkie 3 za pomocą przycinaniagit gc --aggressive --prune=now
rahul286,
1
Ale kiedy usunę repo, a następnie sklonuję je ponownie, rozmiar jest nadal duży. Jak sobie z tym poradzisz?
cwtuan
2

W moim przypadku wypchnąłem kilka dużych (> 100 Mb) plików, a następnie przystąpiłem do ich usuwania. Ale wciąż były w historii mojego repozytorium, więc musiałem je również usunąć.

Jaka była sztuczka:

bfg -b 100M  # To remove all blobs from history, whose size is superior to 100Mb
git reflog expire --expire=now --all
git gc --prune=now --aggressive

Następnie musisz naciskać na gałąź:

git push origin <your_branch_name> --force

bfg to narzędzie, które można zainstalować w systemie Linux i macOS za pomocą brew:

brew install bfg
vinzee
źródło