Вы можете удалить двоичный раздув и сохранить всю свою историю. 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
, который будет объединять коммиты, которые добавляют и удаляют ваши двоичные файлы в один коммит, diff которого - просто любые другие изменения в этих коммитах. Затем он будет повторно применять все последующие коммиты по порядку, когда вы скажете ему завершить:
$ 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
Теперь вы удалили наворот, но сохранили всю оставшуюся историю.