Вы можете удалить двоичный раздувание и сохранить остальную часть своей истории. 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
Теперь вы удалили раздувание, но сохранили остальную часть своей истории.
Вы можете использовать
git filter-branch
с графтами, чтобы сделать коммит номер 4 новым корневым коммитом вашей ветки. Просто создайте файл.git/info/grafts
с одной строкой, содержащей SHA1 фиксации номер 4.Если вы сейчас выполните a
git log
илиgitk
вы увидите, что эти команды будут отображать фиксацию номер 4 как корень вашей ветки. Но на самом деле в вашем репозитории ничего не изменится. Вы можете удалить.git/info/grafts
и выводgit log
илиgitk
будет как раньше. Чтобы на самом деле сделать коммит номер 4, вам придется запустить новый rootgit filter-branch
без аргументов.источник
git gc --prune=0
похоже, не убирает их.git gc --prune=now
физически очищает все коммиты, на которые больше не ссылаются. Если это не работает для вас, возможно, у вас есть ветка удаленного отслеживания, которая по-прежнему ссылается на старый корень. Перечислить с помощьюgit branch -r
, затем удалить удаленную ветку, например, с помощью,git branch -rd origin/master
а затемgit gc --prune=now
снова запустить .Благодаря сообщению JesperE, которое я изучил,
git-filter-branch
это может быть именно то, что вам нужно. Похоже, вы также можете сохранить свои предыдущие коммиты, за исключением того, что они будут изменены после удаления ваших больших файлов. На странице руководства git-filter-branch :Обязательно прочтите эту страницу руководства ... очевидно, вы захотите сделать это на запасном клоне вашего репозитория, чтобы убедиться, что он работает должным образом.
источник
Это
git-fast-export
то, что вы ищете?источник