Если Git продолжает отображать файл, даже когда он соответствует правилу в .gitignore, удалите его из индекса Git, сохранив локальную копию. В Терминале перейдите в репозиторий, выполните git rm --cached -- "path/to/file", а затем закоммитьте эту подготовленную операцию удаления и правило игнорирования. Документация Git подтверждает, что правила игнорирования влияют только на неотслеживаемые файлы; они не прекращают отслеживание файлов, уже находящихся в индексе. (Документация Git по gitignore)
Почему .gitignore не прекратил отслеживание файла
Шаблон в .gitignore указывает Git игнорировать соответствующие неотслеживаемые пути. Если файл уже был добавлен в репозиторий, Git продолжит отслеживать изменения в нем независимо от добавленного позже правила игнорирования. Правило может быть написано верно, но все равно не будет действовать до тех пор, пока вы не удалите этот файл из индекса. (Документация Git по gitignore)
На Mac откройте Терминал и перейдите в корневой каталог репозитория. Apple описывает Терминал как интерфейс командной строки macOS и указывает zsh в качестве оболочки по умолчанию; приведенные ниже команды работают в стандартной конфигурации zsh. Прежде чем вносить изменения в индекс, убедитесь, что вы находитесь в нужном репозитории:
git status
Путь к файлу в следующей команде указывается относительно корня репозитория. Замените пример реальным путем. Сохраняйте кавычки: они защищают пробелы и такие символы, как *, от интерпретации командной оболочкой. Символы -- обозначают конец списка параметров, благодаря чему путь, начинающийся с дефиса, обрабатывается именно как путь.
Удаление файла из индекса с сохранением копии на Mac
Выполните:
git rm --cached -- "path/to/file"
Параметр --cached удаляет путь из индекса Git, но не из рабочего дерева. Файл должен остаться на вашем Mac. Это действие подготавливает операцию удаления для следующего коммита; оно не стирает ранее закоммиченную историю файла. (Документация Git по git rm)
Если путь ведет к каталогу и вы хотите прекратить отслеживание всего каталога, добавьте флаг -r и укажите путь к нему:
git rm --cached -r -- "path/to/directory"
Используйте это с осторожностью: Git удалит из индекса все отслеживаемые пути в этом каталоге. Локальные файлы останутся, но удаление будет проиндексировано. Если Git выдает отказ из-за того, что в файле есть проиндексированные изменения или его содержимое отличается от версии в последнем коммите, остановитесь и проверьте git status; не добавляйте -f, если не понимаете точно, какие подготовленные изменения будут сброшены. Согласно документации Git, принудительный режим отменяет стандартную защиту от потери таких изменений. (Документация Git по git rm)
Проверка правила игнорирования и просмотр изменений перед коммитом
Убедитесь, что шаблон в .gitignore соответствует пути относительно расположения этого файла игнорирования. Например, правило в файле .gitignore в корне репозитория, содержащее local-settings.json, соответствует файлам с таким именем на любом уровне вложенности; /local-settings.json ограничивает соответствие только корнем репозитория. Шаблоны Git рассчитываются относительно каталога, содержащего соответствующий .gitignore, и более специфичные файлы игнорирования на более низких уровнях могут влиять на результат. (Документация Git по gitignore)
Запросите у Git, какое именно правило соответствует файлу, который перестал отслеживаться:
git check-ignore -v -- "path/to/file"
Флаг -v показывает источник и сработавший шаблон. Если команда ничего не выводит, перепроверьте написание, путь и расположение шаблона. В Git FAQ рекомендуется использовать комбинацию git rm --cached и подходящего шаблона игнорирования, чтобы прекратить отслеживание и начать игнорировать уже отслеживаемый файл. (Git FAQ)
Перед выполнением коммита проверьте подготовленные изменения и рабочую копию:
git status
В выводе команды путь должен отображаться как подготовленный к удалению, а .gitignore — как измененный (если изменения в нем еще не были проиндексированы). Рабочий файл по-прежнему должен быть на месте. При необходимости проиндексируйте файл игнорирования, а затем закоммитьте оба изменения:
git add -- .gitignore
git commit -m "Stop tracking local file"
Если нужный файл игнорирования находится в подкаталоге, укажите путь к нему относительно корня репозитория в команде git add. Еще раз проверьте git status перед коммитом — особенно если подготовлены другие изменения, — чтобы в коммит вошли только запланированные правки.
Что происходит после коммита
После коммита Git перестает отслеживать этот путь в текущей ветке, а правило игнорирования не дает случайно добавить его снова. Коммит фиксирует удаление, поэтому у других участников проекта при переключении на этот коммит отслеживаемый файл будет удален из их рабочего дерева; Git не сохраняет автоматически локальную копию у каждого пользователя, если файл стал игнорируемым. Согласуйте действия перед коммитом, если файл содержит общую конфигурацию, которая по-прежнему нужна коллегам. Ранее закоммиченные версии остаются в истории репозитория, поэтому данная процедура не удаляет прошлые копии. (Документация Git по git rm)
Если вы хотите лишь скрыть локальные правки, сохранив отслеживание файла для всех остальных, .gitignore для этого не подходит. Git не рекомендует использовать assume-unchanged или skip-worktree для этих целей; вместо этого рассмотрите вариант с отслеживаемым файлом-шаблоном и отдельным игнорируемым локальным конфигурационным файлом. (Git FAQ)
Источники
Git FAQ — Git
Смена оболочки по умолчанию в Терминале на Mac — Служба поддержки Apple