.gitignore: полный гайд с шаблонами для Python, Node.js, Java и Go
Разобрали, как именно Git читает .gitignore и применяет паттерны. Внутри: шаблоны под 4 стека, настройка глобального ~/.gitignore_global для IDE и ОС, git rm --cached для уже закоммиченных файлов, .gitkeep для пустых директорий и инструменты-генераторы.
.gitignore — это файл, который сообщает Git, какие файлы и директории не нужно отслеживать.
Файл .gitignore — один из первых, который появляется в любом репозитории. Но многие добавляют его по привычке, не разбираясь в синтаксисе и не думая о глобальных настройках. В итоге в историю коммитов попадают .pyc-файлы, папки node_modules и секреты из .env.
В этом гайде разберём синтаксис .gitignore с примерами каждого паттерна, дадим готовые шаблоны для Python, Node.js, Java и Go, а также покажем, как исправить ситуацию, если файл уже попал в индекс. Статья рассчитана на тех, кто уже знаком с основами Git — если нужно освежить базу, начните с введения в Git.
Ключевые выводы
— .gitignore поддерживает паттерны *, **, !, / и комментарии через #
— Готовые шаблоны для Python, Node.js, Java и Go закрывают 90% типичных случаев
— Глобальный ~/.gitignore_global избавляет от повторения в каждом проекте правил для IDE и ОС
— Если файл уже в индексе, git rm --cached убирает его без удаления с диска
— .gitkeep — хак для отслеживания пустых директорий
Эта статья — часть нашего полного путеводителя по Git. Там — весь маршрут: от первого коммита до продвинутых workflow.
Синтаксис .gitignore: разбираем каждый паттерн
Git читает .gitignore построчно. Пустые строки игнорируются, строки с # в начале — комментарии. Остальное — паттерны.
* — любое количество символов в имени файла (кроме /):
** — любое количество директорий (рекурсивно):
! — отмена предыдущего правила (исключение из исключений):
Важно: паттерн ! не работает, если родительская директория уже заигнорирована. Например, если в .gitignore есть строка build/, то правило !build/keep-me.txt не поможет — файл всё равно будет игнорироваться. Чтобы исключение сработало, нужно сначала разрешить саму директорию: !build/, а затем уже — конкретный файл.
/ в начале — привязка к корню репозитория:
/ в конце — игнорировать только директорию, не файл с таким же именем:
# — комментарий. Используйте для группировки правил:
Шаблон .gitignore для Python
Python генерирует .pyc-файлы и папки __pycache__ при каждом запуске. Виртуальные окружения (venv, .venv) и файлы с переменными окружения (.env) тоже не должны попадать в репозиторий.
Шаблон .gitignore для Node.js
Главная причина тяжёлых репозиториев на Node.js — папка node_modules, которую забыли добавить в .gitignore. Её размер легко достигает сотен мегабайт.
Шаблон .gitignore для Java
Java-проекты собираются Maven или Gradle — у каждого свои папки артефактов. Скомпилированные .class-файлы и .jar-архивы пересобираются при каждом билде и в репозитории не нужны.
Шаблон .gitignore для Go
Go компилирует проект в бинарник — его хранить в репозитории не нужно. Папка vendor/ содержит копии зависимостей: её включать или нет — зависит от политики команды. Если используете Go modules без vendor-режима, добавьте папку в .gitignore.
Глобальный .gitignore: один раз для всех проектов
Некоторые файлы мусорят в любом проекте — .DS_Store на macOS, Thumbs.db на Windows, файлы IDE вроде .idea/ или .vscode/. Дублировать эти правила в каждом репозитории неудобно. Для этого есть глобальный .gitignore.
Настройка через core.excludesFile:
Пример содержимого ~/.gitignore_global:
После настройки Git применяет глобальные правила автоматически во всех репозиториях на вашем компьютере — без изменения .gitignore проекта.
Ещё один способ локально игнорировать файлы — .git/info/exclude. Этот файл работает как .gitignore, но не коммитится в репозиторий и виден только вам. Удобно для временных файлов, специфичных для вашего окружения, которые не стоит выносить в глобальный ~/.gitignore_global.
Файл уже в индексе: как перестать его отслеживать
Добавить правило в .gitignore недостаточно, если файл уже был закоммичен. Git продолжит его отслеживать. Нужно убрать файл из индекса, сохранив его на диске:
После этого добавьте правило в .gitignore и закоммитьте оба изменения — удаление из индекса и обновлённый .gitignore. Сам файл останется у вас на диске, но перестанет появляться в git status.
Если нужно очистить весь индекс и применить правила заново (например, после добавления нескольких паттернов):
Внимание: эта команда пересоздаёт индекс целиком. Не запускайте её при незакоммиченных изменениях.
.gitkeep: как отслеживать пустые директории
Git не отслеживает директории — только файлы. Если папка пустая, git add её просто проигнорирует. Это проблема, когда структура директорий важна для проекта: например, logs/, uploads/, tmp/.
Решение — добавить в пустую папку файл-заглушку .gitkeep:
Файл .gitkeep — неофициальное соглашение. Никакой специальной поддержки в Git нет, это просто пустой файл с понятным именем. Некоторые команды используют .githold или .keep — принципиальной разницы нет.
Инструменты: генераторы готовых шаблонов
Не обязательно писать .gitignore с нуля — есть готовые инструменты:
- gitignore.io (toptal.com/developers/gitignore) — генератор по языку, IDE и ОС. Введите «Python», «JetBrains», «macOS» — получите готовый файл.
- GitHub gitignore templates — официальная коллекция шаблонов от GitHub. Шаблоны для 150+ языков и фреймворков. Используется как основа при создании репозитория через интерфейс GitHub.
gh repo create— при создании репозитория через GitHub CLI можно сразу выбрать шаблон.gitignoreфлагом--gitignore.
Для проверки, почему конкретный файл игнорируется (или не игнорируется), используйте встроенную команду:
Часто задаваемые вопросы
Почему .gitignore не работает для уже закоммиченных файлов?
Git отслеживает файлы, которые уже находятся в индексе, независимо от правил .gitignore. Правила применяются только к неотслеживаемым файлам. Чтобы прекратить отслеживание, нужно убрать файл из индекса командой git rm --cached имя_файла, а затем добавить правило в .gitignore.
Нужно ли коммитить .gitignore в репозиторий?
Да, .gitignore — часть проекта и должен быть в репозитории. Это позволяет всем участникам команды использовать одинаковые правила игнорирования. Личные настройки (файлы конкретной IDE, системные файлы вашей ОС) лучше вынести в глобальный ~/.gitignore_global, а не засорять ими общий файл.
Можно ли иметь несколько .gitignore в одном репозитории?
Да. .gitignore можно размещать в любой поддиректории — правила из него будут применяться к файлам в этой директории и её вложенных папках. Это удобно в монорепозиториях, где каждый модуль имеет свои специфичные артефакты. Правила из корневого .gitignore применяются ко всему репозиторию.
Итог
Правильный .gitignore — это не формальность, а часть культуры работы с репозиторием. Он защищает от утечки секретов, не даёт захламить историю коммитов и экономит время при клонировании. Начните с шаблона под ваш стек (используйте gitignore.io или GitHub-коллекцию), добавьте глобальный файл для настроек IDE, и у вас не будет проблем с лишними файлами в git status.
Если хотите разобраться с Git глубже — изучите полный путеводитель по Git на Tproger: там собраны все ключевые темы от основ до продвинутых техник.