guide

Как игнорировать уже закоммиченные файлы через .gitignore

Как с помощью git rm --cached убрать из отслеживания файлы, которые продолжают отслеживаться после добавления в .gitignore, как найти отслеживаемые файлы, попадающие под правила игнорирования, и что делать, если закоммичены секреты.

Это самый частый вопрос. .gitignore действует только на файлы, которые ещё не отслеживаются. Файл, хотя бы раз попавший в коммит, продолжает показывать изменения и после добавления правила. Чтобы прекратить отслеживание, файл нужно убрать из индекса (области подготовки).

Один файл или одна папка

# 1) Добавить правило в .gitignore (например, .env, dist/)
# 2) Убрать только из индекса — сами файлы в рабочей папке остаются
git rm --cached .env
git rm -r --cached dist/
# 3) Закоммитить
git commit -m "Stop tracking .env and dist"

Ключевой момент — --cached. Без этой опции git rm удалит файлы и из рабочей папки. Для каталогов нужен -r.

Поиск отслеживаемых файлов, попадающих под правила игнорирования

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

git ls-files -ci --exclude-standard

-c означает отслеживаемые файлы, -i — только совпадающие с правилами игнорирования, а --exclude-standard — применять .gitignore, .git/info/exclude и глобальную настройку. Если список верный, их можно разом убрать из отслеживания.

# bash / zsh
git ls-files -ci --exclude-standard -z | xargs -0 git rm --cached --
# PowerShell
git -c core.quotePath=false ls-files -ci --exclude-standard | ForEach-Object { git rm --cached -- "$_" }

Во вкладке Снять отслеживание генератора эти команды можно получить под вашу оболочку.

Как применить всё заново

Если .gitignore сильно изменился, часто очищают индекс и добавляют всё заново.

git rm -r --cached .
git add .
git commit -m "Apply .gitignore"

git add . при повторном добавлении применяет правила игнорирования, поэтому игнорируемые файлы выпадают. Но перед коммитом обязательно проверьте список удалений через git status. В репозиториях с изменённой настройкой переводов строк (core.autocrlf) многие файлы могут отображаться как изменённые.

Влияние на других

Если отправить (push) коммит со снятием отслеживания, у всех, кто получит его через pull, соответствующий файл в рабочей папке будет удалён. С точки зрения git файл был удалён из репозитория. Если это файлы, нужные каждому по отдельности, например .env или настройки IDE, предупредите заранее, чтобы все сделали резервную копию.

Если секреты уже отправлены (push)

Снятие отслеживания влияет только на будущие коммиты. В прошлых коммитах файл остаётся, и любой может извлечь его из истории. Порядок действий такой.

  1. Сначала отзовите раскрытые ключи и пароли и выпустите новые. Это самое важное.
  2. Уберите файл из отслеживания и добавьте его в .gitignore.
  3. При необходимости удалите файл из истории инструментом вроде git filter-repo и выполните принудительный push. Уже клонированные и форкнутые копии так не удалить, поэтому этот шаг не заменяет шаг 1.

assume-unchanged и skip-worktree — не функции игнорирования

git update-index --assume-unchanged и --skip-worktree временно скрывают изменения отслеживаемых файлов, но файлы продолжают отслеживаться.

Документация git тоже не рекомендует использовать эти опции, чтобы игнорировать изменения отслеживаемых файлов. Для общих файлов настроек безопаснее закоммитить config.example.json, а настоящий config.json игнорировать.

Источники

← НазадЛичные правила игнорирования в .git/info/exclude