Программирование и IT
Файл .gitignore
В проекте всегда есть файлы, которым в репозитории не место — кэш, папки сборки, настройки редактора, локальные пароли. Список таких файлов держат в .gitignore, и git перестаёт предлагать их к добавлению.
В этой статье
Зачем он нужен#
Без списка исключений git status превращается в свалку: рядом с твоими
правками висят сотни файлов кэша, а среди них легко не заметить нужное.
Хуже другое — случайно добавленный файл с паролями или ключом попадает в
историю и уезжает на сервер вместе с коммитом.
.gitignore — обычный текстовый файл, который лежит в репозитории и сам
коммитится: правила должны быть одинаковыми у всех, кто работает с
проектом. Он влияет только на файлы, за которыми git ещё не следит. Это и
есть главный источник недоумения, разобранный ниже.
Синтаксис шаблонов#
Одна строка — одно правило. Пустые строки пропускаются, строка с решёткой в
начале считается комментарием.
| Шаблон | Что попадает под правило |
|---|---|
secrets.txt |
файл с таким именем в любой папке репозитория |
*.log |
любые файлы с расширением log |
build/ |
папка build и всё внутри, на любом уровне |
/build |
только build в той же папке, где лежит сам .gitignore |
docs/*.pdf |
pdf прямо в docs, но не в её подпапках |
docs/**/*.pdf |
pdf в docs и во всех её подпапках |
*.py[cod] |
файлы .pyc, .pyo и .pyd |
!example.log |
исключение из предыдущего правила: этот файл не прятать |
Правила простые, но два места стоит запомнить. Слеш внутри шаблона
привязывает его к папке файла .gitignore; без слеша шаблон ищется на
любой глубине. И восклицательный знак не работает, если спрятана вся папка
целиком: git не заходит внутрь исключённой папки и не видит, что там
что-то разрешено, — в таком случае прячут содержимое (logs/*), а потом
делают исключение.
Готовый пример#
Файл в корне проекта на Python:
__pycache__/
*.py[cod]
.venv/
venv/
.idea/
.vscode/
.DS_Store
/dist/
/build/
*.egg-info/
.env
*.local.yml
*.log
!example.log
Первые два блока — то, что создаёт сам язык. Дальше настройки редакторов и
служебный мусор системы. Потом результаты сборки — со слешем в начале,
чтобы не спрятать случайно папку build внутри исходников. И в конце
локальные настройки с секретами плюс логи, из которых один файл-образец
оставлен нарочно.
Заготовки для десятков языков и сред собраны в открытом репозитории
github/gitignore — брать оттуда и дописывать своё быстрее, чем
вспоминать всё с нуля.
Файл уже в репозитории, а правило не действует#
Самая частая жалоба. .gitignore работает только для неотслеживаемых
файлов; если файл однажды попал в коммит, git продолжит следить за ним,
сколько правил ни добавь. Нужно снять его с учёта, оставив на диске:
rm '.env'
Для папки — то же самое с -r: git rm --cached -r .idea. Дальше
изменение фиксируют коммитом, и с этого момента правило действует.
Важная оговорка про секреты: снятие с учёта убирает файл из будущих
коммитов, но не из прошлых. Пароль или токен, побывавший в отправленном
коммите, считается скомпрометированным — его меняют, а не вычищают из
истории.
Где ещё живут правила#
.gitignore может быть не один. Файл в подпапке действует на неё и всё,
что ниже, и его правила добавляются к корневым — удобно, когда у части
проекта свой мусор.
Личные привычки в общий файл не кладут: список для твоего редактора или
операционной системы лучше вынести в глобальный файл, чтобы он работал во
всех проектах сразу.
А правила, нужные только в этой копии репозитория и никому больше, пишут в
.git/info/exclude — он не коммитится и на сервер не уезжает.
Как проверить правило#
Когда непонятно, почему файл прячется (или не прячется), спрашивай
напрямую:
.gitignore:4:.venv/ .venv/bin/python
Ответ читается так: источник правила, номер строки, сам шаблон и путь.
Пустой ответ означает, что под правила файл не подпадает. Посмотреть весь
спрятанный список целиком помогает git status --ignored.
Если правило написано верно, а файл всё равно виден в git status, почти
наверняка он уже отслеживается — возвращайся к git rm --cached и
коммиту через git commit. Прочие команды на каждый
день перечислены в шпаргалке.
План по этапам
- Создать файл в корнеОбычный текстовый .gitignore рядом с папкой .git.
- Внести очевидноеКэш языка, папки сборки, окружение, настройки редактора, локальные секреты.
- Проверить выводgit status: лишнего в списке неотслеживаемых больше нет.
- Снять с учёта староеgit rm --cached для файлов, попавших в репозиторий раньше правила.
- Закоммитить сам файл.gitignore — часть проекта и нужен всем участникам.
Начать изучать эту тему у себя
План ляжет в твой репозиторий: отмечай этапы, веди конспект — история изменений покажет, как ты продвинулся.
Проверь себя
1.Файл .env попал в репозиторий раньше, правило в .gitignore добавили. Что ещё нужно сделать?
2.Что прячет строка build/ в .gitignore?
3.Какая команда покажет, какое именно правило прячет файл?
Источники
-
Pro Git, книга на русскомРаздел «Игнорирование файлов»бесплатно
-
Справка gitignoreФормат шаблонов и порядок применения правилбесплатно
-
Сборник заготовок github/gitignoreГотовые файлы под языки и средыбесплатно
Было полезно?