Применение .gitignore к зафиксированным файлам


436

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

РЕДАКТИРОВАТЬ: я тоже хочу удалить их из хранилища. Это файлы, созданные после сборки или для поддержки пользовательских инструментов.


1
возможный дубликат файла .gitignore, не игнорируемый
Wooble

8
@Wooble Ответ может быть похожим, но этот вопрос точно описывает проблему, с которой я столкнулся и которую необходимо решить.
rjmunro

1
Это ответ, который напрямую отвечает на заглавный вопрос с минимальными изменениями в вашем git-репо: stackoverflow.com/a/26245961/3543437
kayleeFrye_onDeck

Ответы:


472

12
Там много файлов, хотя. Я не хочу делать это для каждого
user880954

1
Находятся ли файлы в каких-либо общих каталогах? Если нет, то проблема сводится к вопросу об использовании оболочки, а не к git.
Мэтт Болл

12
Должен быть режим «Я забыл добавить свой .gitignore до окончания моей первоначальной фиксации».
Люк Пуплетт

9
Ответ ниже этого.
однобоко

3
Он попросил меня добавить флаг -r, чтобы иметь возможность сделать это.
Вишал Гулати

601

После редактирования, .gitignoreчтобы соответствовать игнорируемым файлам, вы можете git ls-files -ci --exclude-standardпросмотреть файлы, включенные в списки исключений; Вы можете сделать

//On Linux:
git ls-files -ci --exclude-standard -z | xargs -0 git rm --cached
//On Windows:
for /F "tokens=*" %a in ('git ls-files -ci --exclude-standard') do @git rm --cached "%a"
//On mac
alias apply-gitignore="git ls-files -ci --exclude-standard -z | xargs -0 git rm --cached"

удалить их из репозитория (не удаляя их с диска).

Редактировать : Вы также можете добавить это как псевдоним в ваш файл .gitconfig, чтобы вы могли запускать его в любое время. Просто добавьте следующую строку в раздел [alias] (измените при необходимости для Windows или Mac):

apply-gitignore = !git ls-files -ci --exclude-standard -z | xargs -0 git rm --cached

( -rФлаг в xargsзапрещает git rmзапускать пустой результат и распечатывать его сообщения об использовании, но может поддерживаться только GNU findutils. Другие версии xargsмогут иметь или не иметь подобную опцию.)

Теперь вы можете просто ввести git apply-gitignoreсвой репо, и он сделает всю работу за вас!


10
Я думаю, что xargs для Mac не имеет -r ... или мой глючит / старый, я не знаю ... и почему !до git? хорошо ... мой работал как alias apply-gitignore="git ls-files -ci --exclude-standard -z | xargs -0 git rm --cached". ТКС!
Фелипе Сабино

18
На Windowsfor /F "tokens=*" %a in ('git ls-files -ci --exclude-standard') do @git rm --cached "%a"
Люк Пуплетт

Это просто удалило мои файлы .gitignore, а не те файлы, которые я хотел игнорировать, которые были перечислены в файлах .gitignore - в этом был смысл?
Хиппиим

@Hippyjim, если файлы уже зафиксированы (даже если они перечислены в .gitignore), а .gitignore еще не зафиксирован, тогда это будет ожидаемый результат, в противном случае я не уверен, что происходит в вашем случае.
Джонатан Каллен

1
Для пользователей Mac -rэто значение по умолчанию и не принимается версиями BSD. Так что убери -r.
Вейши Цзэн

136

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

git update-index --assume-unchanged <file>

и отменить это:

git update-index --no-assume-unchanged <file>

чтобы узнать, какие файлы были установлены таким образом:

git ls-files -v|grep '^h'

благодарность за оригинальный ответ на http://blog.pagebakers.nl/2009/01/29/git-ignoring-changes-in-tracked-files/


1
У Chronial отличный ответ за рекурсивное выполнение этого для каталога: stackoverflow.com/a/16346756/1101076
jordan314

Я хотел зафиксировать конфигурацию IDE, но не отслеживать ненужные изменения в ней. Это работает, хотя я не уверен, будет ли это работать для тех, кто проверяет хранилище. Это может быть объединено с, git ls-files -ci --exclude-standard -z | xargs -0 git update-index --assume-unchangedесли это помогает.
Дламблин

7
Это единственный ответ, который делает именно то, что требует заглавный вопрос. ИДЕАЛЬНО! Большинство из этих других ответов были бесполезны.
kayleeFrye_onDeck

1
Это совершенно правильный ответ на вопрос. Использование таких команд, как git rm --cachedудалит файл в хранилище, что не отвечает требованиям проверки. Спасибо. Я очень ценю это. Ваш ответ мне очень помогает.
ramwin

88

Убедитесь, что ваш реальный репозиторий - самая последняя версия

  1. Отредактируйте .gitignoreкак хотите
  2. git rm -r --cached .
  3. git add .

затем совершите как обычно


14
Это должен быть принятый ответ, поскольку в вопросе конкретно сказано, что нужно удалить много файлов.
nbeuchat

3
Обратите внимание, что шаг 2 может занять некоторое время, если у вас большой репозиторий.
мозговой мешок

Это просто привело к удалению всех файлов из индекса! Это спасло меня: git reset HEAD(не забудьте спрятать любые изменения)
aksh1618

2
Шаг 2 удаляет все, да, но шаг 3 должен прочитать их все, кроме тех, которые терпят неудачу из-за .gitignore.
ojchase

11

Старый вопрос, но некоторые из нас в git-posh(powershell). Это решение для этого:

git ls-files -ci --exclude-standard | foreach { git rm --cached $_ }

0

Следуй этим шагам:

  1. Добавить путь к gitignoreфайлу

  2. Запустите эту команду

    git rm -r --cached foldername
    
  3. совершать изменения как обычно.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.