- Андрей Куманяев/
- Git: руководства и команды/
- .gitignore: полное руководство по исключению файлов из Git/
.gitignore: полное руководство по исключению файлов из Git
При разработке любого проекта неизбежно появляются файлы, которые не должны попадать в репозиторий: зависимости (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».