Как игнорировать расширения? Использование * и **

*.log игнорирует имена с окончанием .log в области .gitignore. Для определённого каталога решите, нужны ли вложенные пути.

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

Как игнорировать папки? folder/ или /folder/

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