Mam repozytorium GitHub, które miało dwie gałęzie - master i release.
Gałąź wydania zawierała binarne pliki dystrybucyjne, które przyczyniły się do bardzo dużego rozmiaru repozytorium (> 250 MB), więc zdecydowałem się uporządkować.
Najpierw usunąłem gałąź zdalnego wydania, za pośrednictwem git push origin :release
Następnie usunąłem lokalną gałąź wydania. Najpierw próbowałem git branch -d release
, ale git powiedział „błąd: gałąź 'release' nie jest przodkiem twojego obecnego HEAD.” co jest prawdą, więc git branch -D release
zmusiłem go do usunięcia.
Ale rozmiar mojego repozytorium, zarówno lokalnie, jak i na GitHub, był nadal ogromny. Więc wtedy przejrzałem zwykłą listę poleceń git, na przykład git gc --prune=today --aggressive
bez powodzenia.
Postępując zgodnie z instrukcjami Charlesa Baileya podanymi w SO 1029969 , udało mi się uzyskać listę SHA1 dla największych plamek. Następnie użyłem skryptu z SO 460331, aby znaleźć plamy ... a pięć największych nie istnieje, chociaż zostały znalezione mniejsze, więc wiem, że skrypt działa.
Myślę, że te blogi są plikami binarnymi z gałęzi wydania i jakoś zostały po usunięciu tej gałęzi. Jak się ich pozbyć?
Odpowiedzi:
... i bez zbędnych ceregieli, przedstawię wam to przydatne polecenie, „git-gc-all”, gwarantujące usunięcie wszystkich śmieci z git, dopóki nie pojawią się dodatkowe zmienne konfiguracyjne:
Być może będziesz musiał najpierw uruchomić coś takiego, ojej, git jest skomplikowany !!
Być może będziesz musiał usunąć niektóre tagi, dzięki Zitrax:
Wszystko to umieściłem w skrypcie: git-gc-all-ferocious .
źródło
objects
. Co to jest i dlaczego są (najwyraźniej) nieistotne?Jak opisano tutaj , jeśli chcesz trwale usunąć wszystko, do czego odwołuje się tylko reflog , po prostu użyj
git reflog expire --expire-unreachable=now --all
usuwa wszystkie odniesienia do nieosiągalnych zatwierdzeń wreflog
.git gc --prune=now
usuwa same zatwierdzenia.Uwaga : tylko użycie
git gc --prune=now
nie zadziała, ponieważ te zatwierdzenia są nadal przywoływane w reflogu. Dlatego wyczyszczenie reflogu jest obowiązkowe. Zauważ również, że jeślirerere
go używasz , dodatkowe odniesienia nie są czyszczone przez te polecenia. Zobacz,git help rerere
aby uzyskać więcej informacji. Ponadto wszelkie zatwierdzenia, do których odwołują się lokalne lub zdalne gałęzie lub tagi, nie zostaną usunięte, ponieważ są one uważane przez git za cenne dane.źródło
git fetch --prune
jeszcze bardziej zmniejsz rozmiar, ponieważ usuwa lokalne obiekty blob.Jak wspomniano w tej odpowiedzi SO ,
git gc
może faktycznie zwiększyć rozmiar repozytorium!Zobacz także ten wątek
Ten sam wątek wspomina :
Na froncie filtru można rozważyć (ostrożnie) ten skrypt
źródło
filter-branch
użycia poleceń.git gc --prune=now
lub niski poziomgit prune --expire now
.źródło
Za każdym razem, gdy porusza się HEAD, git śledzi to w pliku
reflog
. Jeśli usunąłeś zatwierdzenia, nadal masz „wiszące zatwierdzenia”, ponieważ nadal są one przywoływane przezreflog
~ 30 dni. To jest siatka bezpieczeństwa podczas przypadkowego usuwania zatwierdzeń.Możesz użyć
git reflog
polecenia usuń określone zatwierdzenia, przepakuj itp. Lub po prostu polecenia wysokiego poziomu:źródło
Możesz użyć
git forget-blob
.Użycie jest dość proste
git forget-blob file-to-forget
. Więcej informacji znajdziesz tutajhttps://ownyourbits.com/2017/01/18/completely-remove-a-file-from-a-git-repository-with-git-forget-blob/
Zniknie ze wszystkich zatwierdzeń w Twojej historii, reflogu, tagach i tak dalej
Od czasu do czasu napotykam ten sam problem i za każdym razem, gdy muszę wracać do tego postu i innych, dlatego zautomatyzowałem ten proces.
Podziękowania dla współpracowników, takich jak Sam Watkins
źródło
Spróbuj użyć git-filter-branch - nie usuwa dużych obiektów blob, ale może usunąć duże pliki, które określisz z całego repozytorium. Dla mnie zmniejsza rozmiar repozytorium z setek MB do 12 MB.
źródło
Czasami powodem, dla którego „gc” nie daje wiele dobrego, jest to, że istnieje niedokończona rebase lub skrytka oparta na starym zatwierdzeniu.
źródło
Aby dodać kolejną wskazówkę, nie zapomnij użyć git remote prune, aby usunąć przestarzałe gałęzie swoich pilotów przed użyciem git gc
możesz je zobaczyć za pomocą git branch -a
Jest to często przydatne, gdy pobierasz z github i repozytoriów rozwidlonych ...
źródło
Zanim to zrobisz
git filter-branch
igit gc
, powinieneś przejrzeć tagi obecne w repozytorium. Każdy prawdziwy system, który ma automatyczne tagowanie dla rzeczy takich jak ciągła integracja i wdrożenia, sprawi, że niechciane obiekty będą nadal przywoływane przez te tagi, dlategogc
nie można ich usunąć i nadal będziesz się zastanawiać, dlaczego rozmiar repozytorium jest nadal tak duży.Najlepszym sposobem, aby pozbyć się wszystkich nie-chciał rzeczy jest do uruchomienia
git-filter
&git gc
a następnie wcisnąć mistrza do nowej gołej repo. Nowe nagie repozytorium będzie miało oczyszczone drzewo.źródło