Ви можете видалити двійкове здуття і зберегти решту своєї історії. Git дозволяє вам перевпорядковувати та "стискати" попередні коміти, тому ви можете комбінувати лише коміти, які додають і видаляють ваші великі двійкові файли. Якщо додавання було зроблено в одному коміті, а видалення - в іншому, це буде набагато простіше, ніж мати справу з кожним файлом.
$ git log --stat # list all commits and commit messages
Шукайте в комітах, які додають і видаляють ваші двійкові файли, і зазначайте їх SHA1, скажіть 2bcdef
і 3cdef3
.
Потім, щоб відредагувати історію репо, використовуйте rebase -i
команду з її інтерактивною опцією, починаючи з батьківського елемента коміту, куди ви додали свої двійкові файли. Він запустить ваш $ EDITOR, і ви побачите список комітів, починаючи з 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
.
.
Вставте squash 3cdef3
як другий рядок і видаліть рядок, на якому написано pick 3cdef3
зі списку. Тепер у вас є перелік дій для інтерактиву, rebase
які об’єднають коміти, які додають і видаляють ваші двійкові файли, в один коміт, різниця якого - будь-які інші зміни в цих комітах. Потім він повторно застосує всі наступні коміти в порядку, коли ви скажете йому завершити:
$ git rebase --continue
Це займе хвилину-дві.
Тепер у вас є репозиторій, в якому більше немає бінарних файлів, які надходять або йдуть. Але вони все одно займуть місце, оскільки за замовчуванням Git зберігає зміни протягом 30 днів, перш ніж їх можна буде збирати сміття, щоб ви могли передумати. Якщо ви хочете їх видалити зараз:
$ 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
Тепер ви видалили здуття, але зберегли решту історії.