↓Перейти к содержанию
  1. Git: руководства и команды/

.gitignore: полное руководство по исключению файлов из Git

·6 минут·

При разработке любого проекта неизбежно появляются файлы, которые не должны попадать в репозиторий: зависимости (node_modules), секреты (.env), логи, временные файлы, артефакты сборки. Файл .gitignore указывает Git, какие файлы и папки игнорировать. Правильная настройка .gitignore критична для чистоты репозитория и безопасности проекта.

Что такое .gitignore #

.gitignore — это обычный текстовый файл, который находится в корне репозитория (или в любой подпапке). В нём перечислены паттерны файлов и папок, которые Git должен не отслеживать. Любой файл, соответствующий паттерну, не будет включён в git add и, следовательно, никогда не попадёт в коммит.

Файл .gitignore сам по себе добавляется в репозиторий — это важная часть проекта, которую должны видеть все разработчики.

Зачем нужен .gitignore #

В репозитории не должны быть файлы нескольких категорий:

Зависимости и пакеты — занимают много места и легко восстанавливаются из package.json, requirements.txt, Gemfile и т.д.:

  • node_modules/ (Node.js)
  • venv/, env/ (Python)
  • .bundle/ (Ruby)

Конфиденциальные данные — секреты, которые нельзя публиковать ни при каких условиях:

  • .env — API-ключи, пароли базы данных
  • config/secrets.yml
  • *.pem, *.key — сертификаты

Скомпилированные файлы — генерируются автоматически:

  • *.pyc, __pycache__/ (Python)
  • *.class, *.jar (Java)
  • *.o, *.a (C/C++)

Артефакты сборки — результаты компиляции или бандлинга:

  • dist/, build/, out/

Файлы IDE и редакторов:

  • .vscode/, .idea/
  • *.sublime-project, *.sublime-workspace

Системные файлы:

  • .DS_Store (macOS)
  • Thumbs.db (Windows)
  • *.swp (Vim)

Синтаксис .gitignore #

Простые паттерны #

# Игнорировать конкретный файл
config.local.js

# Игнорировать все файлы с расширением
*.log
*.tmp
*.bak

# Игнорировать папку (и всё её содержимое)
node_modules/
venv/
dist/

Комментарии #

Строки, начинающиеся с #, — это комментарии. Пустые строки игнорируются:

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

# Конфигурация
.env

Отрицание (исключения из правил) #

Восклицательный знак ! отменяет предыдущий паттерн. Это позволяет создавать исключения:

# Игнорировать все логи
*.log

# Но оставить important.log
!important.log

# Игнорировать всё содержимое папки logs
logs/*

# Но сохранить .gitkeep для сохранения структуры папок
!logs/.gitkeep

Важно: нельзя вернуть файл, если его родительская папка уже игнорируется.

Привязка к корню репозитория #

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

# Игнорировать /build в корне, но не в подпапках
/build

# Игнорировать build в любом месте
build/

Рекурсивные паттерны #

Двойная звёздочка ** означает любое количество вложенных папок:

# Игнорировать temp в любой папке
**/temp

# Игнорировать *.log в любой подпапке папки logs
logs/**/*.log

# Игнорировать все файлы в docs/generated
docs/**/generated/

Одиночные символы #

? заменяет один любой символ, [...] — один символ из указанного набора:

# Совпадает с file1.txt, file2.txt, filea.txt
file?.txt

# Совпадает с file0.txt, file1.txt, ..., file9.txt
file[0-9].txt

# Совпадает с фото и фоты, но не с фотография
фото[ие].jpg

Проверка работы .gitignore #

Посмотреть игнорируемые файлы #

git status --ignored

Проверить конкретный файл #

git check-ignore -v file.log
# .gitignore:5:*.log    file.log
# Строка 5 в .gitignore соответствует этому файлу

Показать все отслеживаемые файлы #

git ls-files

Показать все игнорируемые файлы #

git ls-files --exclude-standard --others --ignored

Шаблоны .gitignore для разных проектов #

Node.js / JavaScript #

# Зависимости
node_modules/
npm-debug.log*
yarn-debug.log*
yarn-error.log*

# Конфигурация
.env
.env.local
.env.*.local

# Сборка
dist/
build/
.next/
.nuxt/

# Кеш
.cache/
.parcel-cache/

Python #

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

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

# Конфигурация
.env
*.egg-info/
dist/
build/

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

Java #

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

# Результаты сборки
target/
build/
out/

# IDE
.idea/
*.iml
.project
.classpath

# Gradle
.gradle/

Django #

# Python
__pycache__/
*.pyc

# Виртуальное окружение
venv/

# Конфигурация
.env
local_settings.py

# База данных (для разработки)
db.sqlite3

# Медиафайлы
/media/

# Статика (если генерируется)
/staticfiles/

Универсальный шаблон для любого проекта #

# Конфиденциальные данные (ВСЕГДА игнорировать!)
.env
.env.*
*.pem
*.key
secrets.yml
config/secrets.yml

# IDE
.vscode/
.idea/
*.sublime-project
*.sublime-workspace

# ОС
.DS_Store
.DS_Store?
Thumbs.db
Desktop.ini

# Логи
*.log
logs/

# Временные файлы
*.tmp
*.temp
*.swp
*~

Глобальный .gitignore #

Некоторые файлы стоит игнорировать глобально — для всех проектов на вашем компьютере (например, .DS_Store или файлы IDE):

# Настроить путь к глобальному gitignore
git config --global core.excludesFile ~/.gitignore_global

# Создать и заполнить файл
cat > ~/.gitignore_global << 'EOF'
# macOS
.DS_Store
.AppleDouble
.LSOverride

# Windows
Thumbs.db
Desktop.ini

# Linux
*~

# IDE
.vscode/
.idea/
*.sublime-project
*.sublime-workspace

# Редакторы
*.swp
*.swo
EOF

Добавление уже отслеживаемого файла в .gitignore #

Если файл уже добавлен в репозиторий и затем вы добавили его в .gitignore — Git продолжит его отслеживать. Нужно явно удалить файл из индекса (не удаляя его с диска):

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

# Если нужно удалить целую папку
git rm --cached -r node_modules/

# Проверьте статус
git status

# Создайте коммит
git commit -m "chore: перестать отслеживать .env"

# Теперь файл игнорируется

Важно: если вы случайно закоммитили секреты (API-ключи, пароли), одного git rm --cached недостаточно — данные останутся в истории коммитов. В этом случае нужно сменить скомпрометированные ключи и, при необходимости, переписать историю.

.gitignore в подпапках #

.gitignore работает не только в корне — можно создать его в любой подпапке. Правила такого файла применяются только к его папке и вложенным папкам:

# Структура проекта
project/
├── .gitignore          # глобальные правила
├── src/
│   └── .gitignore      # правила только для src/
└── tests/
    └── .gitignore      # правила только для tests/

Практический пример: создание .gitignore для Node.js проекта #

# 1. Создание .gitignore
cat > .gitignore << 'EOF'
# Зависимости
node_modules/
npm-debug.log

# Конфигурация
.env
.env.local

# IDE
.vscode/
.idea/

# Логи
*.log

# ОС
.DS_Store
Thumbs.db

# Сборка
dist/
build/
EOF

# 2. Проверка работы
git status
git check-ignore -v .env
git check-ignore -v node_modules/

# 3. Добавление .gitignore в репозиторий
git add .gitignore
git commit -m "chore: add .gitignore"

# 4. Если .env уже был в репозитории
git rm --cached .env
git commit -m "chore: stop tracking .env file"

Ресурсы: готовые шаблоны #

Не нужно писать .gitignore с нуля. Существуют готовые шаблоны:

  • GitHub: github.com/github/gitignore — официальная коллекция шаблонов для сотен языков и фреймворков
  • gitignore.io: сайт, генерирующий .gitignore по вашему стеку технологий
  • GitHub при создании репозитория: предлагает выбрать шаблон .gitignore

Часто задаваемые вопросы #

Почему Git отслеживает файл, который я добавил в .gitignore? Если файл уже был закоммичен до добавления в .gitignore, Git продолжает его отслеживать. Выполните git rm --cached <файл> и создайте новый коммит.

Применяется ли .gitignore ко всем репозиториям? Нет, только к текущему. Для глобального применения настройте ~/.gitignore_global через git config --global core.excludesFile.

Как игнорировать папку, но сохранить один файл внутри? Используйте отрицание: folder/ и !folder/important.txt. Однако это не работает, если игнорируется родительская папка — тогда содержимое не проверяется.

Я случайно закоммитил .env с паролями. Что делать? Немедленно смените все скомпрометированные ключи и пароли. Затем добавьте .env в .gitignore, выполните git rm --cached .env и закоммитьте. Для удаления из истории потребуется git filter-branch или утилита git-filter-repo.

Можно ли использовать несколько .gitignore-файлов в проекте? Да. Создайте .gitignore в любой подпапке — правила будут применяться только к ней и её вложенным папкам.

Заключение #

Правильно настроенный .gitignore — это основа чистого репозитория. Добавляйте его в самом начале проекта, не дожидаясь, пока лишние файлы попадут в историю. Используйте готовые шаблоны с github.com/github/gitignore и адаптируйте их под нужды вашего проекта.

Главное правило: никогда не коммитьте секреты. .env, ключи API, пароли — всё это должно быть в .gitignore с первого коммита.

Следующий шаг после настройки .gitignore — научиться правильно добавлять файлы в индекс: «git add: добавление файлов в staging area».