1. Игнорируйте расширение во всём проекте
В корневом .gitignore шаблон совпадает с app.log, logs/app.log и src/app.log. * означает ноль или больше символов, кроме /; без / в шаблоне Git проверяет имена на любой глубине под этим .gitignore.
Пишите каждый шаблон отдельной строкой. Это правила Git, не shell-команды и не регулярные выражения: *.{log,tmp} здесь не является списком расширений.
*.log 2. Ограничьте шаблон каталогом
Первый вариант совпадает с logs/app.log, но не с logs/archive/app.log. Второй — с обоими: /**/ допускает ноль или больше промежуточных каталогов. Ни один не совпадает с src/app.log.
При сравнении применяйте только один вариант. /logs/ может скрыть вложенные файлы, исключив родителя; проверьте другие правила до оценки шаблона.
/logs/*.log/logs/**/*.log 3. Проверьте характерные пути
Выберите правило, создайте три неотслеживаемых файла и проверьте совпадения:
git check-ignore -v -- logs/app.log logs/archive/app.log src/app.logС /logs/**/*.log оба пути под logs должны совпасть, а src/app.log — нет. Совпадение с ! означает исключение из игнорирования; оставляйте родительские каталоги доступными для обхода.
Точное поведение и подробности описаны в официальных источниках: Документация Git · Документация git check-ignore