Вы можете удалить двоичный раздувание и сохранить остальную часть своей истории. 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
Теперь вы удалили раздувание, но сохранили остальную часть своей истории.