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

436

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

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

user880954
источник
1
возможный дубликат файла .gitignore, не игнорируемый
Wooble
8
@Wooble Ответ может быть похожим, но этот вопрос точно описывает проблему, с которой я столкнулся и которую необходимо решить.
rjmunro
1
Это ответ, который напрямую отвечает на заглавный вопрос с минимальными изменениями в вашем git-репо: stackoverflow.com/a/26245961/3543437
kayleeFrye_onDeck

Ответы:

472
  1. Изменить, .gitignoreчтобы соответствовать файлу, который вы хотите игнорировать
  2. git rm --cached /path/to/file

Смотрите также:

Мэтт Болл
источник
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/

ben.tiberius.avery
источник
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. совершать изменения как обычно.

Калян Чакраварти V
источник