Czy istnieje sposób na zmniejszenie rozmiaru folderu git?

156

Wygląda na to, że mój projekt z każdym dupkiem staje się coraz większy commit/push. Czy istnieje sposób na wyczyszczenie mojego folderu git?

Sheehan Alam
źródło

Odpowiedzi:

214

Nie jestem pewien, czego chcesz. Po pierwsze, oczywiście za każdym razem, gdy dokonujesz zatwierdzeń / wypychania, katalog będzie trochę większy, ponieważ musi przechowywać każde z tych dodatkowych zatwierdzeń.

Jednak prawdopodobnie chcesz, git gcaby "wyczyścił niepotrzebne pliki i zoptymalizował repozytorium lokalne" ( strona podręcznika ).

Innym ewentualnie Odpowiednie polecenie to git clean, które będą usuwać pliki nieśledzone z drzewa ( podręcznik strona ).

houbysoft
źródło
30
git clean -d -f -x usuwa pliki wymienione w .gitignore i tym podobne. Np. Obszary robocze, które nie należą do gita, folderu Pods itp.
Kalle,
102
WARNINGPolecenie opisane powyżej przez @Kalle usunie WSZYSTKIE > NIEŚLADOWANE <PLIK I KATALOG W TWOIM KORZENIU GIT , a nie tylko „pliki wymienione w .gitignore”. Wszystko, co nie jest śledzone przez Git, niezależnie od tego, czy jest wymienione, czy nie, .gitignorezostanie wyczyszczone. git clean -dfX(zwróć uwagę na literę X) spowoduje usunięcie tylko elementów, dla których obowiązuje reguła .gitignore. Zwróć uwagę na to ostrzeżenie: Nigdy nie uruchamiaj git cleanbez uruchomienia go w trybie interaktywnym z -izamiast -flub przynajmniej najpierw wykonując próbny bieg - -na potem ponownie z -f.
Adrian Günter
5
Albo zrobienie kopii zapasowej :-)
Mateen Ulhaq
61

Biegać:

git remote prune origin

Usuwa wszystkie nieaktualne gałęzie śledzenia, które zostały już usunięte w, originale nadal są lokalnie dostępne w remotes/origin.

git gc --auto

G arbage C olekcja” - uruchamia housekeeping zadania (kompresy zmiany usuwa luźne / niedostępne obiektów). --autoFlag najpierw określa, czy konieczne jest praca, i wyjść, nie robiąc nic, jeśli nie.

phamductri
źródło
4
Jakieś wyjaśnienie tego, co robią? Wiem, że możemy ich wygooglować i poszukać ich dokumentacji, ale często podaje się krótki opis odpowiedzi, gdy dotyczy to tylko kodu lub poleceń.
Dzhuneyt,
28

Jeden ze scenariuszy, w którym repozytorium git będzie się znacznie zwiększać z każdym zatwierdzeniem, to taki, w którym zatwierdzasz pliki binarne, które generujesz regularnie. Ich przechowywanie nie będzie tak wydajne jak plik tekstowy .

Innym jest taki, w którym masz ogromną liczbę plików w jednym repozytorium (co jest limitem git ) zamiast kilku podrzędnych ( zarządzanych jako podmoduły ).

W tym artykule na temat przestrzeni git , AlBlue wspomina:

Zwróć uwagę, że Git (i Hg oraz inne DVCS) cierpią z powodu problemu polegającego na tym, że (duże) pliki binarne są wpisywane, a następnie usuwane, ponieważ nadal będą pojawiać się w repozytorium i zajmować miejsce, nawet jeśli nie są aktualne .

Jeśli masz duże pliki binarne przechowywane w repozytorium git, możesz rozważyć:

Jak już wspomniano w „ Jakie są granice plików w Git (liczba i wielkość)? ”, Tym bardziej niedawne (2015, 5 lat po tej odpowiedzi) Git LFS z GitHub to sposób zarządzania tymi dużych plików (przechowując je poza Repozytorium Git).

VonC
źródło
1
Obsługa dużych plików git jest przydatna, jeśli masz rutynowo dodawane / aktualizowane duże pliki binarne (takie jak obrazy). Zobacz git-lfs.github.com . Bardzo łatwy do wdrożenia, obsługiwany przez github. Wszyscy członkowie zespołu muszą go zainstalować, aby wspólnie z niego korzystać.
Eric Woods
@EricWoods True. Wspomniałem wcześniej o Git-LFS (64 razy: stackoverflow.com/search?tab=newest&q=user%3a6309%20git-lfs ). Odpowiednio zredagowałem tę starą odpowiedź.
VonC,
Ha, rzeczywiście! Zabawne, że odpowiedź w wieku 9+ jest nadal aktualna (a teraz jeszcze bardziej w przypadku informacji z LFS).
Eric Woods,
22

tak tak, git gcjest rozwiązaniem, oczywiście,

i lokalnie - wystarczy usunąć lokalne repozytorium i ponownie je sklonować,

ale jest tu coś ważniejszego ...

sekundy, w których czekasz na przetworzenie tego ogromnego gita i danych zewnętrznych, są zbierane do długich minut, które są zbierane do godzin nieefektywnego spędzonego czasu

Utwórz nowe (całkowicie, a nie tylko gałąź) repozytorium od podstaw , w tym jedyną najnowszą wersję plików, naturalnie stracisz całą historię,

ale kiedy w świecie kodu nie jest czas na sentymentalność, nie ma sensu przeciągać przez całe 5 lat kodu po każdym zatwierdzeniu lub różnicach, nadal możesz gdzieś przechowywać stare git & externals, jeśli poczujesz nostalgię:]

ale w pewnym momencie naprawdę musisz iść naprzód:]

Twój zespół będzie Ci wdzięczny!

Społeczność
źródło
12
Całkowicie się zgadzam, ostatnio przyjęliśmy to podejście do starego repozytorium i nie oglądaliśmy się wstecz; cóż, głównie dlatego, że nie możemy, ale wiecie o co mi chodzi :)
WhatIsHeDoing
13

Uruchomienie tego polecenia jest niezwykle niebezpieczne, ale zmniejszy twoje repozytorium, usuwając wszystkie pliki odzyskiwania / kopii zapasowej git:

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

Spowoduje to usunięcie wszystkich plików, których git używa do odzyskania repozytorium po złym poleceniu, na przykład, jeśli to zrobiłeś git reset --hard, zwykle możesz odzyskać utracone pliki. Ale jeśli zrobisz to git reset --hardprzed git reflog expire...rozkazem, stracisz wszystko. Teraz jedyną nadzieją jest użycie narzędzia, które analizuje system plików i próbuje odzyskać usunięte pliki, jeśli nie zostały one zastąpione.

użytkownik
źródło
3
Naprawdę nie nazwałbym tego wyjątkowo niebezpiecznym . Po prostu nazwałbym to czymś, na co trzeba uważać . Z mojego doświadczenia wynika, że ​​bardzo niewielu rzeczywiście dotyka reflektora lub nieosiągalnych obiektów - większość nawet nie wie, że tam są ani jak z nimi współdziałać, więc grzęzną w sytuacjach, w których byłyby przydatne lub robią rzeczy strasznie nieefektywny sposób. Powiedziałbym nawet, że jeśli nie wiesz i nie wiesz, co zrobią te polecenia, możesz je bezpiecznie uruchomić!
Chris Morgan,
10

git clean -d -f -i to najlepszy sposób, aby to zrobić.

Pomoże to w czyszczeniu w bardziej kontrolowany sposób.

-i oznacza interaktywność.

anandharshan
źródło
3
Chociaż pytanie OP jest niejasne i jest to dobra odpowiedź w tym względzie, chciałbym zwrócić uwagę, że git cleannie służy ono do czyszczenia repozytorium, a raczej do czyszczenia katalogu. Uwaga dla użytkowników, którzy ślepo kopiują / wklejają; usuwa to nieśledzone pliki / katalogi, które możesz chcieć lokalnie.
sojowy
git clean -d -x -f działa dobrze, jeśli chcesz przeprowadzić głębokie czyszczenie
Rishabh Jain
2

Nie wiem, czy to się zmniejszy, ale po uruchomieniu git cleanczęsto też to robię git repack -ad, co zmniejsza liczbę plików paczek.

Damien Sawyer
źródło
5
przepakowanie jest częścią git gcprocesu, więc nie trzeba go uruchamiać osobno
artkoshelev