Большинство разработчиков знают про
.gitignore. Файл в корне проекта, куда складывают
node_modules,
.env, логи и прочий мусор, который не должен попасть в репозиторий. Но
Git умеет игнорировать файлы не только с помощью
.gitignore. Есть еще два уровня и каждый решает свою задачу.
Три уровня игнорирования:
- Первый уровень - .gitignore. Это классика. Файл лежит в репозитории, попадает под контроль версий и работает у всех, кто клонирует проект. Сюда пишут все, что относится к проекту целиком: зависимости, артефакты сборки, локальные конфиги IDE.
- Второй уровень - .git/info/exclude. Файл внутри директории .git. Он работает так же, как .gitignore, но не попадает в коммиты. Это место для личных правил, которые нужны только вам: черновики, заметки, экспериментальные скрипты.
- Третий уровень - ~/.config/git/ignore. Глобальный файл для всех репозиториев на вашей машине. Сюда добавляют то, что мешает везде. Например, на macOS это .DS_Store. На Windows - Thumbs.db. Настройка делается один раз и забывается.
Когда что использовать:
- .gitignore - для командных правил. Если файл должен игнорироваться у всех, кто работает над проектом, он идет сюда.
- .git/info/exclude - для личных правил внутри одного репозитория. У вас есть файл notes.txt с пометками для себя. Добавлять его в .gitignore не хочется - коллегам он не нужен. В exclude он не отслеживается только у вас.
- ~/.config/git/ignore - для системных файлов. .DS_Store, Thumbs.db, .swp - все, что создается автоматически и раздражает в каждом проекте.
Как проверить, кто именно игнорирует файл:
Когда правил много, легко запутаться.
Git дает команду
git check-ignore -v, которая показывает, какой именно файл игнорирует конкретный файл.
$ git check-ignore -v .DS_Store
/Users/user/.config/git/ignore:2:.DS_Store .DS_Store
Если файл игнорируется
.gitignore, вывод начнется с
.gitignore. Если
exclude - с
.git/info/exclude. Если глобальным
ignore - с путем в домашней директории. Если команда ничего не выводит - файл никто не игнорирует.
Как переопределить глобальный файл:
Путь к глобальному файлу можно изменить. Например, использовать
.gitignore_global в домашней директории.
git config --global core.excludesFile ~/.gitignore_global
Вернуть стандартное поведение:
git config --global --unset core.excludesFile
Важный нюанс:
Если файл уже попал в коммит, добавить его в
.gitignore недостаточно.
Git продолжит его отслеживать. Сначала нужно удалить его из индекса.
git rm --cached filename
После этого локальная копия останется на диске, но
Git перестанет ее отслеживать.
Вывод:
Git дает три уровня игнорирования и каждый решает свою задачу.
.gitignore - для командных правил.
.git/info/exclude - для личных исключений в одном репозитории.
~/.config/git/ignore - для глобальной чистоты на всей машине.
Разделение уровней помогает не засорять общие правила личными исключениями и не тащить в коммиты то, что нужно только вам. Правильный выбор уровня избавляет команду от конфликтов и лишних правок
.gitignore.