Как полностью удалить файл из репозитория git?

Недавно я заметил, что файлы проектов, которые используют мои текстовые редакторы (вместе с некоторыми другими нежелательными файлами), добавили репозиторий git для проекта. Поскольку они фактически не являются частью проекта, я бы хотел их удалить, но git rm не удаляет старые версии из репозитория, и я не мог найти ничего другого, что выглядит многообещающим.

Ответ 1

Инструмент, который вы хотите, это git filter-branch. Его использование описано здесь, но в основном:

$ git filter-branch --tree-filter 'rm -f my_file' HEAD

удалит "my_file" из каждого коммита.

Обратите внимание, что при этом происходит перезапись каждого коммита, поэтому, если вы отправляете в удаленный репозиторий, вы должны (а) принудительно обновить и (б) все остальные, кто извлекал у вас данные, теперь будут иметь дублированные коммиты (поскольку вы переписали историю), так как описано на странице руководства git rebase.

Ответ 2

Это то, за что git filter-branch, но будьте осторожны, что ваша история репо изменится, и хеши фиксации будут отличаться после перезаписи истории.

Если вы также хотите освободить место, я рекомендую вам использовать git forget-blob, потому что git filter-branch сам по себе не сделает git забыть ваш файл, так как он все еще может ссылаться на пульты, рефлоги, теги и т.д..

git forget-blob main.c.swp

Вы можете получить дополнительную информацию здесь