Удаление файла из истории репозитория git

Нельзя сказать наверняка, но вероятно, есть одна или несколько упакованных ссылок, которые все еще ссылаются на старые коммиты, сделанные до того, как вы запустили git filter-branch. Это объясняет, почему git fsck --full --unreachable не считает большой двоичный объект недоступным объектом, даже если срок действия вашего журнала ссылок истек и исходные распакованные ссылки были удалены.

Вот что надо сделать после того, как будут выполнены git filter-branch и git gc:

1) Убедитесь, что оригинальные ссылки исчезли:

rm -rf .git/refs/original

2) Уберите все reflog entries:

git reflog expire --all --expire='0 days'

3) Проверьте все устаревшие packed refs:

Потенциально это может быть сложно, в зависимости от того, сколько у вас упакованных ссылок. Нет ни одной команды Git, которая автоматизировала бы это, поэтому придется сделать это вручную. Сделайте резервную копию .git/packed-refs. Теперь отредактируйте .git/packed-refs. Проверьте наличие старых ссылок - в частности, посмотрите, не упакованы ли какие-либо ссылки из .git/refs/original. Если вы обнаружите какие-либо старые файлы, которые не должны там быть, удалите их (удалите строку для этой ссылки).

После завершения очистки упакованного файла -refs посмотрите, замечает ли git fsck недоступные объекты:

git fsck --full --unreachable
Если это сработало и git fsck теперь сообщает, что ваш большой объект недоступен, можно перейти к следующему шагу.

4) Перепакуйте запакованный архив:

git repack -A -d
Это гарантирует, что недоступные объекты будут распакованы и останутся распакованными.

5) Обрежьте недоступные объекты:

git prune
Это должно сработать. У Git действительно должен быть лучший способ управления упакованными ссылками.
При отсутствии лучшего способа ручное редактирование упакованного файла -refs может быть единственным способом.