Если Git на вашем Mac игнорирует файл, выполните git check-ignore -v -- 'path/to/file' из репозитория в Терминале. Вывод покажет источник игнорирования, номер строки, совпадающий шаблон и путь, чтобы вы могли найти правило и решить, нужно ли его изменить. Если файл уже отслеживается, повторите проверку с параметром --no-index.

Запуск проверки из репозитория

Откройте Терминал и перейдите в корневой каталог репозитория. Вы можете ввести cd с пробелом на конце, перетащить папку проекта из Finder в окно Терминала, чтобы вставить путь к ней, а затем нажать Return. Убедитесь, что вы находитесь в рабочем дереве Git, с помощью команды git status; если Git сообщает, что каталог не является репозиторием, сначала перейдите в фактическую папку репозитория проекта.

Используйте путь к файлу относительно корня репозитория. Например, чтобы диагностировать build/cache.json, выполните:

git check-ignore -v -- 'build/cache.json'

Одинарные кавычки делают путь литеральным для стандартной командной оболочки macOS — zsh. Они особенно полезны, если имя содержит пробелы или такие символы, как *, которые оболочка иначе бы интерпретировала. Символы -- обозначают конец списка параметров, что также предотвращает обработку пути, начинающегося с дефиса, как флага команды.

Анализ вывода для поиска правила

Подробный вывод совпадения выглядит следующим образом:

.gitignore:12:build/    build/cache.json

Поля означают следующее: .gitignore — это исходный файл, 12 — номер строки в нем, build/ — сам шаблон, а build/cache.json — запрошенный вами путь. Откройте этот файл-источник в удобном текстовом редакторе и проверьте указанную строку. Источником также может оказаться вложенный .gitignore, файл .git/info/exclude или глобальный файл исключений, настроенный для вашей учетной записи Git. Git документирует поля подробного вывода и эти источники правил игнорирования.

Путь к источнику в .git/info/exclude применяется к данному репозиторию, но обычно не передается другим клонам. Глобальный файл исключений применяется ко всем вашим личным репозиториям. Шаблон в .gitignore, как правило, является подходящим местом для правила, которое должно действовать для всего проекта. Git проверяет источники игнорирования по приоритету: файлы .gitignore более низкого уровня могут переопределять правила родительских каталогов, а итоговый результат определяет последний совпавший шаблон на том же уровне приоритета. Руководство по gitignore объясняет приоритеты и назначение каждого источника.

Если Git ничего не выводит

Отсутствие вывода обычно означает, что ни один шаблон игнорирования не подошел под указанный путь. Обычный вывод команды просто перечисляет игнорируемые пути; используйте флаг -v, чтобы увидеть сработавший шаблон. Убедитесь, что вы находитесь в нужном репозитории, а также проверьте правильность написания пути и регистр символов.

Отслеживаемые файлы — частая причина путаницы: по умолчанию git check-ignore не сообщает о них, поскольку правила игнорирования применяются только к файлам, которые еще не отслеживаются. Добавьте флаг --no-index, чтобы Git в любом случае проверил правила:

git check-ignore -v --no-index -- 'build/cache.json'

Этот параметр служит для диагностики правила; он не прекращает отслеживание файла и не удаляет его из коммита. Официальный способ Git прекратить отслеживание — команда git rm --cached с последующим добавлением подходящего правила игнорирования. Это изменяет индекс, поэтому перед выполнением проверьте статус и убедитесь, что понимаете последствия. Git разъясняет ограничения, связанные с отслеживаемыми файлами, и действие параметра --no-index.

Проверка исключений и области действия шаблонов

Совпавшая строка, начинающаяся с !, является отрицанием (исключением): она может вернуть путь обратно в поле зрения Git после более раннего правила игнорирования, поэтому совпадение с такой строкой в подробном выводе не означает, что файл игнорируется. Кроме того, Git не может повторно включить файл, если исключен его родительский каталог; сначала родительский каталог необходимо сделать доступным для обхода с помощью соответствующих правил. Документация Git по шаблонам описывает отрицание и это ограничение родительских каталогов.

Шаблоны интерпретируются относительно файла .gitignore, в котором они находятся. Шаблон с косой чертой действует в пределах каталога этого файла; простое имя может сопоставляться на этом уровне и ниже. Это важно, если правило поступает из вложенного .gitignore: выведенный шаблон может выглядеть правильным, но применяться к другому поддереву каталогов. Обращайте внимание как на текст шаблона, так и на расположение файла-источника.

Для одного файла команды git check-ignore -v обычно достаточно, чтобы понять, где искать проблему. Для уже отслеживаемого файла добавьте параметр --no-index; после этого используйте полученный источник, строку и шаблон, чтобы решить, нужно ли изменить правило, сузить его область действия или оставить без изменений.

Источники