1. Разберите неработающий шаблон
Пусть в корне есть неотслеживаемые build/keep.txt и build/discard.txt. Эти правила исключают сам build: Git не обходит его для поиска keep.txt. Позднее исключение не возвращает файл.
/build/
!/build/keep.txt 2. Игнорируйте содержимое, сохранив один файл
Замените два прежних правила в корневом .gitignore следующими. build остаётся доступен для обхода, его непосредственное содержимое игнорируется, keep.txt возвращается. Для более глубоких исключений все родительские каталоги тоже должны быть доступны для обхода.
При равном приоритете побеждает последнее совпадающее правило. Ставьте исключение после запрета и проверяйте другие правила и вложенные .gitignore.
/build/*
!/build/keep.txt 3. Проверьте оба файла
Создайте два файла и выполните команды из корня репозитория. Подробный вывод должен показать !/build/keep.txt для keep.txt и /build/* для discard.txt. Строка с ! означает возврат файла, а не игнорирование.
git check-ignore -v -- build/keep.txt build/discard.txtСтатус должен показать build/keep.txt как неотслеживаемый и не показать build/discard.txt. Для уже отслеживаемых файлов см. отдельную статью: правила не меняют индекс.
git status --short --untracked-files=all -- build/ Точное поведение и подробности описаны в официальных источниках: Документация Git · Документация git check-ignore