2010-08-11 2 views
57

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

+3

частичного дублирования, безусловно, охватывает предыдущие вопросы: http://stackoverflow.com/questions/307828/git-remove-file-accidentally-added-to -the-repository http://stackoverflow.com/questions/1216733/remove-a-directory-permanently-from-git – Cascabel

ответ

110

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

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

удалит "my_file" из каждый фиксации.

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

+15

Я рекомендую добавить '--prune-empty', поэтому любые пустые коммиты, созданные в результате, будут удалены слишком. – fnkr

+0

Как это работает в репозитории со многими файлами с тем же именем в разных каталогах? Удаляет ли все файлы с тем же именем? – CodeMonkey

+1

@CodeMonkey: В этом случае вы должны использовать более длинный уникальный путь. – mipadi

5

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

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

git forget-blob main.c.swp

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

Смежные вопросы