Możesz usunąć binarny wzdęcie i zachować resztę swojej historii. Git umożliwia zmianę kolejności i „zgniatanie” wcześniejszych zatwierdzeń, dzięki czemu można łączyć tylko te zatwierdzenia, które dodają i usuwają duże pliki binarne. Jeśli wszystkie dodania zostały wykonane w jednym zatwierdzeniu, a usunięcia w innym, będzie to znacznie łatwiejsze niż zajmowanie się każdym plikiem.
$ git log --stat # list all commits and commit messages
Wyszukaj w niej zatwierdzenia, które dodają i usuwają twoje pliki binarne i zanotuj ich SHA1, powiedzmy 2bcdef
i 3cdef3
.
Następnie, aby edytować historię repozytorium, użyj rebase -i
polecenia z opcją interaktywną, zaczynając od rodzica zatwierdzenia, do którego dodałeś pliki binarne. Uruchomi twój $ EDITOR i zobaczysz listę zatwierdzeń zaczynających się od 2bcdef
:
$ git rebase -i 2bcdef^ # generate a pick list of all commits starting with 2bcdef
# Rebasing zzzzzz onto yyyyyyy
#
# Commands:
# pick = use commit
# edit = use commit, but stop for amending
# squash = use commit, but meld into previous commit
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
pick 2bcdef Add binary files and other edits
pick xxxxxx Another change
.
.
pick 3cdef3 Remove binary files; link to them as external resources
.
.
Wstaw squash 3cdef3
jako drugą linię i usuń linię, która mówi pick 3cdef3
z listy. Masz teraz listę akcji interaktywnych, rebase
która połączy zatwierdzenia, które dodają i usuwają twoje pliki binarne w jeden zatwierdzenie, którego różnicą są po prostu inne zmiany w tych zatwierdzeniach. Następnie ponownie zastosuje wszystkie kolejne zatwierdzenia w kolejności, gdy powiesz mu, aby ukończył:
$ git rebase --continue
Zajmie to minutę lub dwie.
Masz teraz repozytorium, w którym nie ma już przychodzących ani wychodzących plików binarnych. Ale nadal będą zajmować miejsce, ponieważ domyślnie Git przechowuje zmiany przez 30 dni, zanim będą mogły zostać zebrane, abyś mógł zmienić zdanie. Jeśli chcesz je teraz usunąć:
$ git reflog expire --expire=1.minute refs/heads/master
#all deletions up to 1 minute ago available to be garbage-collected
$ git fsck --unreachable # lists all the blobs(files) that will be garbage-collected
$ git prune
$ git gc
Teraz usunąłeś wzdęcie, ale zachowałeś resztę swojej historii.
Możesz użyć
git filter-branch
z graftami, aby zatwierdzić numer 4 jako nowe zatwierdzenie root twojej gałęzi. Po prostu utwórz plik.git/info/grafts
zawierający tylko jedną linię zawierającą SHA1 zatwierdzenia numer 4.Jeśli teraz zrobisz
git log
lubgitk
zobaczysz, że te polecenia wyświetlą zatwierdzenie numer 4 jako katalog główny twojej gałęzi. Ale w twoim repozytorium nic się nie zmieni. Możesz usunąć,.git/info/grafts
a wyjściegit log
lubgitk
będzie jak poprzednio. Aby zatwierdzić numer 4 jako nowy root, będziesz musiał uruchomićgit filter-branch
bez argumentów.źródło
git gc --prune=0
wydaje się, że ich nie czyści.git gc --prune=now
fizycznie czyści wszystkie zatwierdzenia, do których nie ma już odniesienia. Jeśli to nie zadziała, możesz mieć zdalną gałąź śledzenia, która nadal odwołuje się do starego katalogu głównego. Wyświetl listę za pomocągit branch -r
, a następnie usuń zdalną gałąź, na przykład za pomocą,git branch -rd origin/master
a następnie uruchomgit gc --prune=now
ponownie.Dzięki wpisowi JesperE, który przyjrzałem się
git-filter-branch
- to może być to, czego chcesz. Wygląda na to, że możesz zachować również swoje wcześniejsze zatwierdzenia, z wyjątkiem tego, że zostaną zmodyfikowane po usunięciu dużych plików. Ze strony podręcznika git-filter-branch :Koniecznie przeczytaj tę stronę podręcznika ... oczywiście chciałbyś to zrobić na wolnym klonie swojego repozytorium, aby upewnić się, że działa zgodnie z oczekiwaniami.
źródło
Czy
git-fast-export
to, czego szukasz?źródło