Как игнорировать файл, который уже зафиксирован? - PullRequest
26 голосов
/ 09 марта 2009

Ранее мой .gitignore файл был следующим:

...
config/database.yml
.DS_Store

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

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

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

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

Ответы [ 2 ]

48 голосов
/ 09 марта 2009

Как упомянуто в " игнорирование не удаляет файл "
(следующая цитата из замечательной статьи Ника Кваранто ,
в своем блоге git ready "выучи git по одному коммиту за раз"):

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

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

git rm --cached <file>

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

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

  • переписать коммиты вашего репозитория или
  • начать все сначала.

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

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

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

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

0 голосов
/ 26 февраля 2019

, что не помогает, когда вы хотите начать игнорировать файл, который был зафиксирован, и хотите сохранить его в проекте ... так как git rm --cached удалит его из git repo. ..

Я нашел это Как мне остановить Git от отслеживания любых изменений в файле после этого коммита вперед? что я искал ..

надеюсь, это полезно и для других людей ...

...