Урок 8. Файл .gitignore: что не класть в репозиторий
Не всё, что лежит в папке проекта, нужно хранить в истории. Мусор и секреты в репозитории мешают всем: история раздувается, git status показывает сотни лишних файлов, а пароль из настроек виден каждому, кто получил копию. Список того, что Git должен не замечать, пишут в файл .gitignore.
Что обычно исключают
- Результаты сборки: папки
build/,dist/, файлы*.exe,*.o,*.class— их всегда можно собрать заново. - Зависимости:
node_modules/в JavaScript,.venv/в Python — они ставятся по списку из проекта. - Временные файлы и кэш:
__pycache__/,*.log,*.tmp. - Настройки редактора и системы:
.idea/,.vscode/,.DS_Store(macOS),Thumbs.db(Windows). - Секреты:
.env, файлы с паролями, ключами и токенами.
Создайте .gitignore
Файл называется ровно .gitignore — с точкой в начале и без расширения — и лежит в корне репозитория, рядом с папкой .git. Создайте его в редакторе или командой touch .gitignore и впишите правила, по одному в строке:
# Журналы и временные файлы
*.log
*.tmp
# Зависимости и сборка
node_modules/
/build/
# Секреты
.envСам .gitignore добавляют в репозиторий как обычный файл: git add .gitignore и коммит. Тогда правила действуют у всех, кто работает с проектом.
В Windows Проводник и Блокнот иногда дописывают к имени .txt, и получается .gitignore.txt, который Git не читает. Включите показ расширений в Проводнике или создайте файл командой в Git Bash.
Правила шаблонов
| Запись | Что исключает |
|---|---|
secret.txt | Файл или папку с таким именем на любом уровне |
*.log | Все файлы с расширением .log везде |
temp/ | Папки temp на любом уровне вместе с содержимым (но не файл temp) |
/build/ | Только папку build в корне репозитория, не src/build |
docs/*.pdf | PDF прямо в docs, но не в docs/api |
!keep.log | Исключение из правила выше: keep.log снова отслеживается |
# текст | Комментарий |
Правило с ! не работает, если исключена вся папка, в которой лежит файл: после logs/ строка !logs/k.log ничего не вернёт. Git не заглядывает в исключённые папки. Чтобы исключить всё в папке, кроме одного файла, пишут logs/* и затем !logs/k.log.
Пример для проекта на Python
__pycache__/
*.pyc
.venv/
.env
.idea/
.vscode/Готовые списки для разных языков и редакторов предлагают и хостинги — например, GitHub при создании репозитория. Это хорошая основа, которую потом дополняют своим.
Файл уже в репозитории — .gitignore «не работает»
.gitignore действует только на неотслеживаемые файлы. Если файл уже был в коммите, Git продолжит следить за ним, что бы ни было написано в .gitignore. Его нужно убрать из индекса, оставив на диске:
$ git rm --cached .env
rm '.env'
$ git commit -m "Файл .env больше не отслеживается"Для папки — с ключом -r: git rm -r --cached build. Подробнее — в справке Как удалить файл из репозитория, но оставить на диске.
Удаление из индекса не стирает файл из прошлых коммитов: кто получит копию репозитория, увидит его в истории. Если туда попал пароль или ключ, смените его, а как почистить историю — в справке Как убрать пароль из истории Git.
Почему файл игнорируется
Иногда наоборот: файл нужен, а Git его не видит. Какое правило виновато, показывает git check-ignore -v:
$ git check-ignore -v logs/k.log
.gitignore:2:*.log logs/k.logФайл .gitignore, строка 2, правило *.log. Если команда ничего не вывела — файл не игнорируется.
Свои правила, которые не нужны остальным
.git/info/exclude— те же правила, но только для вашей копии репозитория; файл не отправляется на сервер.- Общий список для всех репозиториев — например, для файлов своего редактора. Создайте файл и укажите его Git:
git config --global core.excludesFile ~/.gitignore_globalПустые папки
Git хранит файлы, а не папки: пустая папка в коммит не попадёт. Если папка нужна в проекте (например, logs для журналов программы), в неё кладут пустой файл — по обычаю его называют .gitkeep — и добавляют его.
Коротко
.gitignoreв корне репозитория — список того, что Git не замечает; сам файл коммитят.*.log— по маске,temp/— папки,/build/— только в корне,!— исключение из правила.- Уже отслеживаемый файл
.gitignoreне скрывает — сначалаgit rm --cached. git check-ignore -v файлпоказывает, какое правило сработало.- Секреты не должны попадать в коммиты вовсе: из истории их убрать сложнее, чем не добавить.