2009-08-01 15 views
48

W moim osobistym repozytorium git mam katalog zawierający tysiące małych obrazów, które nie są już potrzebne. Czy istnieje sposób na usunięcie ich z całej historii git? PróbowałemUsuwanie katalogu na stałe z git

git filter-branch --index-filter "git rm -rf --cached --ignore-unmatch imgs" HEAD 

i

git filter-branch --tree-filter 'rm -fr imgs' HEAD 

ale wielkość repo git pozostaje niezmieniona. Jakieś pomysły?

Dzięki

+2

Nie jestem pewien, ale czy próbowałeś już uruchomić 'git gc'? Może nadal są tam jako śmieci ... –

+0

@Martinho: tak, jestem – adk

+0

Będziesz musiał usunąć wszystkie stare referencje (np. Nazwy oddziałów, tagi), a potem możesz uruchomić 'git gc --aggressive'. – vdboor

Odpowiedz

15

Właściwie żadna z tych technik workedfor mnie. znalazłem najbardziej wiarygodne było to po prostu wyciągnąć lokalnie do innego repo:

git pull file://$(pwd)/myGitRepo 

oszczędza również ci kłopotów deletig starych tagów.

zobaczyć historię na moim blogu: http://stubbisms.wordpress.com/2009/07/10/git-script-to-show-largest-pack-objects-and-trim-your-waist-line/

+0

To wydaje się być blisko dla mnie.Mam udokumentowane szczególne kroki systemu Windows tutaj: http: //www.somethingorothersoft.com/?p = 80 –

32

Książka ProGit ma interesujący rozdział poświęcony Removing Object.

To nie koniec z tym:

Historia nie zawiera odniesienie do tego pliku.
Jednak twój reflog i nowy zestaw poprawek, które Git dodał, gdy robiłeś filter-branch pod .git/refs/original nadal, więc musisz je usunąć, a następnie przepakować bazę danych. Trzeba pozbyć się wszystkiego, co posiada wskaźnik do tych starych zobowiązuje zanim zapakować:

$ rm -Rf .git/refs/original 
$ rm -Rf .git/logs/ 
$ git gc 
$ git prune --expire 

(git prune --expire nie jest obowiązkowe, ale może usunąć zawartość katalogu z luźnych obiektów)
zapasowej wszystko przed wykonaniem te komendy, na wszelki wypadek;)

+0

Link do książki już nie działa :-( – rescdsk

+3

@rescdsk Przywróciłem link – VonC

+0

Awesome, thanks! – rescdsk

13

git-filter-branch domyślnie zapisuje stare referencje w przestrzeni nazw refs/original/*.

Trzeba je usunąć, a następniezrobić git gc --prune=now

3

Jeśli chcesz jechać trasą ręcznego oczyszczania, istnieje kilka plików, które mogą również zawierać ref do położenia pierwotnego oddziału przed git- gałąź filtra. Na przykład, filtruje mój "domowy" Branża:

.git/info/pozycje literatury:

179ad3e725816234a7182476825862e28752746d pozycje literatury/Original/bibl/głowy/home

.git/upakowane bibl:

179ad3e725816234a7182476825862e28752746d bibl/Original/bibl/głowice/home

Po usunąłem te linie, gitk nie pokazują stare popełnia więcej.

+1

zadziałało dla mnie, chociaż zastanawiam się, czy to naprawiło widok gitk, czy reflekcje będą teraz dostępne teraz. – gravitation

10

Brandon Thomson zapytał w komentarzu do rozwiązania Rainer Blome „s czy to po prostu stała na stanowisku gitk lub jeśli sędziowie będą naprawdę zniknął. Dobrym sposobem na sprawdzenie tego jest, aby pamiętać jedną z mieszań SHA1 (lub unikalny prefiks nim) starego zatwierdzeń i spróbuj

$ git ls-tree hash-value 

ten powinien pokazać treść repo głównym folderze, jak to było w to zatwierdzenie. Po

$ rm -Rf .git/refs/original 
$ rm -Rf .git/logs/ 

jak wynika VonC i usuwanie refs/original/… linie z .git/info/refs i .git/packed-refs jak wynika Rainer Blome, ostateczna

$ git gc --prune=now 

wykonane nie tylko sędziowie, ale także stare obiekty (zatwierdzenia, drzewa i obiekty blob) znikają. Pokazany powyżej git ls-tree hash-value to potwierdza. Kolejną miłą komendą do sprawdzenia tego jest git count-objects -v (uruchom przed filtrem-brach i po przycięciu i porównaj rozmiar).

Uwaga: Nie mam jeszcze uprawnień do komentowania innych odpowiedzi, musiałem napisać nowy, chociaż głównie łączy on poprzednie podane odpowiedzi.

+0

Ta odpowiedź * wydaje się * jak poprawne rozwiązanie dla mnie. Jednak nie rozumiem, dlaczego całkowity rozmiar mojego repozytorium pozostaje niezmieniony. – dbn

2

Ponieważ jest to stare pytanie, być może niektóre z nich nie były wtedy możliwe. Zakłada to również, że używasz bash lub cygwin.

Ostrzeżenie: Drugi i trzeci wiersz trwale usunie wszystkie zatwierdzenia niedostępne dla twoich oddziałów/znaczników.

Po uruchomieniu filter-branch, zrobić

for ref in $(git for-each-ref --format='%(refname)' refs/original); do git update-ref -d $ref; done 
git reflog expire --expire=now --all 
git gc --prune=now 

git for-each-ref --format='%(refname)' pobiera nazwy referencyjnych i git update-ref -d usuwa odniesienia. Generalnie lepiej nie modyfikować bezpośrednio folderu .git, a w szczególności to polecenie obsługuje skrzynkę, gdy dane ref są w packed-refs.

Druga i trzecia linia są pobierane bezpośrednio z How to clean up unused side-branches in your commit trees?.

Powiązane problemy