.gitignore: полный гайд с шаблонами для Python, Node.js, Java и Go

Разобрали, как именно Git читает .gitignore и применяет паттерны. Внутри: шаблоны под 4 стека, настройка глобального ~/.gitignore_global для IDE и ОС, git rm --cached для уже закоммиченных файлов, .gitkeep для пустых директорий и инструменты-генераторы.

Обложка: .gitignore: полный гайд с шаблонами для Python, Node.js, Java и Go

.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 построчно. Пустые строки игнорируются, строки с # в начале — комментарии. Остальное — паттерны.

* — любое количество символов в имени файла (кроме /):

			*.log        # все .log-файлы
*.pyc        # все скомпилированные Python-файлы
*.class      # все скомпилированные Java-классы
		

** — любое количество директорий (рекурсивно):

			**/temp      # папка temp на любом уровне вложенности
logs/**      # всё внутри папки logs
a/**/b       # папка b, вложенная в a через любое число уровней
		

! — отмена предыдущего правила (исключение из исключений):

			*.log
!important.log   # игнорируем все .log, но important.log — отслеживаем

# Или: игнорируем секретный .env, но шаблон сохраняем
.env
!.env.example
		

Важно: паттерн ! не работает, если родительская директория уже заигнорирована. Например, если в .gitignore есть строка build/, то правило !build/keep-me.txt не поможет — файл всё равно будет игнорироваться. Чтобы исключение сработало, нужно сначала разрешить саму директорию: !build/, а затем уже — конкретный файл.

/ в начале — привязка к корню репозитория:

			/dist        # только папка dist в корне, не dist/ во вложенных директориях
/TODO.md     # только файл TODO.md в корне репозитория
		

/ в конце — игнорировать только директорию, не файл с таким же именем:

			build/        # директория build, но не файл build
node_modules/ # только директория, не файл node_modules
		

# — комментарий. Используйте для группировки правил:

			# Зависимости
node_modules/

# Артефакты сборки
dist/
build/

# Секреты
.env
.env.local
		

Шаблон .gitignore для Python

Python генерирует .pyc-файлы и папки __pycache__ при каждом запуске. Виртуальные окружения (venv, .venv) и файлы с переменными окружения (.env) тоже не должны попадать в репозиторий.

			# Байт-код и кэш
__pycache__/
*.py[cod]
*$py.class

# Виртуальные окружения
venv/
.venv/
env/
.env/
ENV/

# Переменные окружения
.env
.env.local
.env.*.local
!.env.example

# Дистрибутивы и сборка
dist/
build/
*.egg-info/
*.egg

# Тестирование и покрытие
.pytest_cache/
.coverage
htmlcov/
.tox/

# Jupyter Notebook
.ipynb_checkpoints/

# mypy, ruff
.mypy_cache/
.ruff_cache/

# PyInstaller
*.spec
		

Шаблон .gitignore для Node.js

Главная причина тяжёлых репозиториев на Node.js — папка node_modules, которую забыли добавить в .gitignore. Её размер легко достигает сотен мегабайт.

			# Зависимости
node_modules/
.pnp
.pnp.js

# Артефакты сборки
dist/
build/
.next/
.nuxt/
.output/

# Переменные окружения
.env
.env.local
.env.development.local
.env.test.local
.env.production.local
!.env.example

# Логи
npm-debug.log*
yarn-debug.log*
yarn-error.log*
*.log

# Кэш
.cache/
.eslintcache
.stylelintcache

# Тестирование
coverage/

# Системные файлы
.DS_Store
Thumbs.db
		

Шаблон .gitignore для Java

Java-проекты собираются Maven или Gradle — у каждого свои папки артефактов. Скомпилированные .class-файлы и .jar-архивы пересобираются при каждом билде и в репозитории не нужны.

			# Скомпилированные файлы
*.class
*.jar
*.war
*.ear
*.nar

# Maven
target/
pom.xml.tag
pom.xml.releaseBackup
pom.xml.versionsBackup
pom.xml.next

# Gradle
.gradle/
build/
out/
!gradle/wrapper/gradle-wrapper.jar

# Логи
*.log

# Файлы IDE
.idea/
*.iml
*.iws
.classpath
.project
.settings/

# Системные файлы
.DS_Store
Thumbs.db
		

Шаблон .gitignore для Go

Go компилирует проект в бинарник — его хранить в репозитории не нужно. Папка vendor/ содержит копии зависимостей: её включать или нет — зависит от политики команды. Если используете Go modules без vendor-режима, добавьте папку в .gitignore.

			# Бинарники
bin/
*.exe
*.exe~
*.dll
*.so
*.dylib

# Тестовые бинарники
*.test

# Профилировочные данные
*.prof

# Зависимости (если не используете vendor-режим)
vendor/

# Переменные окружения
.env
.envrc

# Логи и временные файлы
*.log
tmp/
		

Глобальный .gitignore: один раз для всех проектов

Некоторые файлы мусорят в любом проекте — .DS_Store на macOS, Thumbs.db на Windows, файлы IDE вроде .idea/ или .vscode/. Дублировать эти правила в каждом репозитории неудобно. Для этого есть глобальный .gitignore.

Настройка через core.excludesFile:

			# Создать файл
touch ~/.gitignore_global

# Подключить глобально
git config --global core.excludesFile ~/.gitignore_global
		

Пример содержимого ~/.gitignore_global:

			# macOS
.DS_Store
.AppleDouble
.LSOverride

# Windows
Thumbs.db
ehthumbs.db
Desktop.ini

# Linux
*~

# JetBrains IDE
.idea/
*.iml

# VS Code
.vscode/

# Vim
*.swp
*.swo
[._]*.sw[a-p]
		

После настройки Git применяет глобальные правила автоматически во всех репозиториях на вашем компьютере — без изменения .gitignore проекта.

Ещё один способ локально игнорировать файлы — .git/info/exclude. Этот файл работает как .gitignore, но не коммитится в репозиторий и виден только вам. Удобно для временных файлов, специфичных для вашего окружения, которые не стоит выносить в глобальный ~/.gitignore_global.

Файл уже в индексе: как перестать его отслеживать

Добавить правило в .gitignore недостаточно, если файл уже был закоммичен. Git продолжит его отслеживать. Нужно убрать файл из индекса, сохранив его на диске:

			# Убрать один файл из индекса
git rm --cached .env

# Убрать директорию рекурсивно
git rm --cached -r node_modules/

# Убрать все .pyc-файлы
git rm --cached '*.pyc'
		

После этого добавьте правило в .gitignore и закоммитьте оба изменения — удаление из индекса и обновлённый .gitignore. Сам файл останется у вас на диске, но перестанет появляться в git status.

Если нужно очистить весь индекс и применить правила заново (например, после добавления нескольких паттернов):

			git rm -r --cached .
git add .
git commit -m "chore: apply .gitignore rules to existing files"
		

Внимание: эта команда пересоздаёт индекс целиком. Не запускайте её при незакоммиченных изменениях.

.gitkeep: как отслеживать пустые директории

Git не отслеживает директории — только файлы. Если папка пустая, git add её просто проигнорирует. Это проблема, когда структура директорий важна для проекта: например, logs/, uploads/, tmp/.

Решение — добавить в пустую папку файл-заглушку .gitkeep:

			# Создать пустую директорию с placeholder-файлом
mkdir -p logs uploads tmp
touch logs/.gitkeep uploads/.gitkeep tmp/.gitkeep

# Добавить в .gitignore содержимое, но не сам .gitkeep
logs/*
!logs/.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.

Для проверки, почему конкретный файл игнорируется (или не игнорируется), используйте встроенную команду:

			# Проверить, будет ли файл проигнорирован
git check-ignore -v path/to/file

# Показать все игнорируемые файлы
git status --ignored
		
Часто задаваемые вопросы
1
Почему .gitignore не работает для уже закоммиченных файлов?

Git отслеживает файлы, которые уже находятся в индексе, независимо от правил .gitignore. Правила применяются только к неотслеживаемым файлам. Чтобы прекратить отслеживание, нужно убрать файл из индекса командой git rm --cached имя_файла, а затем добавить правило в .gitignore.

2
Нужно ли коммитить .gitignore в репозиторий?

Да, .gitignore — часть проекта и должен быть в репозитории. Это позволяет всем участникам команды использовать одинаковые правила игнорирования. Личные настройки (файлы конкретной IDE, системные файлы вашей ОС) лучше вынести в глобальный ~/.gitignore_global, а не засорять ими общий файл.

3
Можно ли иметь несколько .gitignore в одном репозитории?

Да. .gitignore можно размещать в любой поддиректории — правила из него будут применяться к файлам в этой директории и её вложенных папках. Это удобно в монорепозиториях, где каждый модуль имеет свои специфичные артефакты. Правила из корневого .gitignore применяются ко всему репозиторию.

Итог

Правильный .gitignore — это не формальность, а часть культуры работы с репозиторием. Он защищает от утечки секретов, не даёт захламить историю коммитов и экономит время при клонировании. Начните с шаблона под ваш стек (используйте gitignore.io или GitHub-коллекцию), добавьте глобальный файл для настроек IDE, и у вас не будет проблем с лишними файлами в git status.

Если хотите разобраться с Git глубже — изучите полный путеводитель по Git на Tproger: там собраны все ключевые темы от основ до продвинутых техник.

Рекомендуем