2009-03-09 2 views
24

Ранее следующий мой .gitignore файл:Как игнорировать файл, который уже установлен?

... 
config/database.yml 
.DS_Store 

Позже я создал app_config.yml файл в каталоге конфигурации и его совершившее.

Теперь я понял, что мне не нужен файл app_config.yml в репозитории git. И я изменил мой .gitignore файл:

... 
config/app_config.yml 
config/database.yml 
.DS_Store 

Теперь, когда я совершаю, что app_config.yml файл все еще в моем репо. Я хочу удалить этот файл из своего репо. Как мне это сделать?

ответ

43

Как упоминалось в "ignoring doesn't remove a file"
(следующая цитата большая статья из Ник Quaranto,
в своем блоге git ready "узнать мерзавца один совершить за один раз"):

Когда вы говорите Git игнорировать файлы, это остановит просмотр изменений для этого файла, и ничего больше.
Это означает, что история все равно будет помнить файл и иметь его
.

Если вы хотите удалить файл из хранилища, но держать его в рабочем каталоге, просто используйте:

git rm --cached <file> 

Однако, это все равно будет сохранить файл в истории.

Если вы действительно хотите, чтобы удалить его из истории, у вас действительно есть два варианта:

  • переписывания фиксаций вашего хранилища или
  • начать заново.

Оба варианта действительно сосут, и это по уважительной причине: Git пытается не потерять ваши данные.
Как и при перезагрузке, Git заставляет вас думать об этих вариантах, поскольку они являются разрушительными операциями.

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

git filter-branch --index-filter 'git rm --cached <file>' HEAD 

Это действие определенно может быть полезно, когда вам нужно задуть или конфиденциальную информацию, которые могут быть размещены в вашем хранилище