Я не могу сказать наверняка без доступа к вашим данным репозитория, но я полагаю, что, вероятно, есть один или несколько упакованных ссылок, которые все еще ссылаются на старые коммиты до того, как вы запустили git filter-branch
. Это объясняет, почему git fsck --full --unreachable
не называет большой BLOB-объект недоступным объектом, даже если вы исчерпали свой reflog и удалили исходные (неупакованные) ссылки.
Вот что я бы сделал (после того, как git filter-branch
и git gc
были сделаны):
1) Убедитесь, что исходные ссылки пропали:
rm -rf .git/refs/original
2) Срок действия всех записей reflog:
git reflog expire --all --expire='0 days'
3) Проверить старые упакованные ссылки
Это может быть сложно, в зависимости от того, сколько у вас упакованных рефсов. Я не знаю ни одной команды Git, которая автоматизирует это, поэтому я думаю, что вам придется делать это вручную. Сделайте резервную копию .git/packed-refs
. Теперь отредактируйте .git/packed-refs
. Проверьте старые ссылки (в частности, посмотрите, упаковал ли он какие-либо ссылки из .git/refs/original
). Если вы обнаружите, что старые не нужны, удалите их (удалите строку для этой ссылки).
После завершения очистки файла packed-refs
посмотрите, заметит ли git fsck
недоступные объекты:
git fsck --full --unreachable
Если это сработало, и git fsck
теперь сообщает, что ваш большой объект недоступен, вы можете перейти к следующему шагу.
4) Перепакуйте ваш упакованный архив (ы)
git repack -A -d
Это гарантирует, что недоступные объекты будут распакованы и останутся распакованными.
5) Обрезка незакрепленных (недоступных) предметов
git prune
И это должно сделать это. Git действительно должен иметь лучший способ управлять упакованными ссылками. Может быть, есть лучший способ, о котором я не знаю. В отсутствие лучшего способа единственным возможным вариантом может быть ручное редактирование файла packed-refs
.