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.