Синтаксис шаблонов .gitignore: полный обзор
Синтаксис шаблонов gitignore с таблицами примеров: комментарии, экранирование и конечные пробелы, отрицание !, завершающий слеш, привязка, подстановочные знаки *, ? и [], правила для **.
Каждая строка .gitignore — это один шаблон. Синтаксис похож на glob в командной оболочке, но смысл сильно зависит от положения слеша и положения **. Изложенное ниже опирается на официальную документацию git gitignore(5), а примеры проверены вручную в git 2.50.
Пустые строки, комментарии, экранирование
- Пустая строка ни с чем не совпадает. Её используют как разделитель для удобства чтения.
- Строка, начинающаяся с
#, — комментарий. Чтобы игнорировать файл, имя которого начинается с#, поставьте перед ним обратный слеш:\#. - Пробелы в конце строки игнорируются. Если нужно имя файла, оканчивающееся пробелом, защитите пробел обратным слешем, как в
foo\. Пробелы в начале строки остаются частью шаблона. - Строка, начинающаяся с
!, — отрицающий шаблон. Для файла, имя которого начинается с!, пишите\!important.txt.
Конечные пробелы невидимы и потому часто становятся причиной ошибок. Если правило не срабатывает, включите в редакторе отображение пробелов. Помните также, что удаляются только пробелы, а символы табуляции — нет.
Завершающий слеш: только каталоги
Если шаблон оканчивается на /, он совпадает только с каталогами. build/ игнорирует каталог build и всё его содержимое, но не файл с именем build. Напротив, build без слеша совпадает и с файлами, и с каталогами с таким именем.
Слеш фиксирует положение
Если в шаблоне, не считая завершающего слеша, есть / в начале или в середине, он совпадает только с путями относительно каталога, в котором лежит .gitignore. Это обычно называют привязкой (anchoring). Без / git ищет совпадающие имена на любой глубине ниже места расположения .gitignore.
| Шаблон | Совпадает | Не совпадает |
|---|---|---|
debug.log | debug.log, logs/debug.log | — |
/debug.log | debug.log | logs/debug.log |
logs/debug.log | logs/debug.log | app/logs/debug.log |
doc/frotz/ | каталог doc/frotz/ | a/doc/frotz/ |
frotz/ | каталоги frotz/, a/frotz/ | файл frotz |
Особенно путает третья строка. В logs/debug.log есть слеш в середине, поэтому шаблон привязан к корню и означает то же, что и с / в начале. Чтобы поймать logs/debug.log на любой глубине, используйте **/logs/debug.log.
Подстановочные знаки: *, ?, [ ]
*совпадает с любой строкой, кроме/(включая пустую строку).*.logсовпадает и сapp.log, и сa/b/app.log, аlogs/*.log— только сlogs/app.log, но не сlogs/2026/app.log.?совпадает с одним любым символом, кроме/.file?.txtсовпадает сfile1.txt, но не сfile10.txt.[a-z]совпадает с одним символом из диапазона,[!a-z]или[^a-z]— с одним символом вне диапазона.*.py[cod]сразу ловит.pyc,.pyoи.pyd. Квадратные скобки тоже не совпадают с/.- Можно использовать и классы символов POSIX, например
[[:digit:]].
Две звёздочки **
** имеет особый смысл только рядом со слешем.
| Форма | Смысл | Примеры |
|---|---|---|
**/foo | foo на любой глубине | foo, a/foo, a/b/foo |
**/logs/debug.log | logs/debug.log на любой глубине | logs/debug.log, app/logs/debug.log |
abc/** | всё внутри abc | abc/x, abc/x/y (но не сам abc) |
a/**/b | ноль или больше каталогов между ними | a/b, a/x/b, a/x/y/b |
В остальных позициях, например в foo** или **bar, ** ведёт себя как обычная * и не переходит через слеш. docs/**/*.pdf совпадает и с docs/manual.pdf, и с docs/a/b/manual.pdf, потому что /**/ совпадает и с нулём каталогов.
Итог на одном небольшом примере
# Результаты сборки (только каталог build в корне)
/build/
# Лог-файлы на любой глубине, но важный лог оставляем
*.log
!important.log
# Все PDF внутри docs
docs/**/*.pdf
# Файл, имя которого начинается с #
\#scratch.md
| Путь | Результат | Решающее правило |
|---|---|---|
build/app.js | игнорируется | /build/ |
src/build/app.js | отслеживается | нет |
logs/server.log | игнорируется | *.log |
logs/important.log | отслеживается | !important.log |
docs/api/v1.pdf | игнорируется | docs/**/*.pdf |
#scratch.md | игнорируется | \#scratch.md |
Эту таблицу можно воспроизвести, вставив правила и пути во вкладку Тест шаблонов генератора.
Источники
- Официальная документация gitignore (git-scm.com)
- GitHub Docs: Ignoring files
- Дата проверки: 2026-09-23 (примеры проверены в git 2.50.1)