
Многоуровневая система игнорирования файлов в Git
Игнорирование файлов в репозитории можно настроить на нескольких уровнях, каждый из которых имеет свои особенности:
-
Глобальный уровень: Игнорирование файлов для всех репозиториев на компьютере. Это настраивается в конфигурационном файле, который распространяется на все репозитории пользователя.
-
Уровень репозитория: Игнорирование файлов для конкретного репозитория, которое распространяется на всех пользователей, работающих с этим проектом. Настройки хранятся в файле
.gitignore, который находится в корневой папке репозитория. -
Уровень пользователя: Игнорирование файлов только для конкретного пользователя и его рабочей директории в репозитория. Эти настройки задаются через файл
.git/info/exclude, который не включается в контроль версий и доступен только локально для данного пользователя.
Такая многоуровневая система позволяет гибко управлять исключениями файлов из версионного контроля в зависимости от ваших нужд.
Настройка gitignore на глобальном уровне
Нужно создать файл .gitignore такой же как мы создаем в каждом репозитории. Обычно его создают в домашнем каталоге, но можно в любом месте на компьютере
После создания файла, нужно сообщить системе Git где находится глобальный gitignore
git config --global core.excludesfile <путь_к_файлу>/.gitignore
Настройки gitignore на уровне репозитория
Файл .gitignore — это правило для всех участников проекта, которое указывает системе Git, какие файлы следует игнорировать в репозитории. Эти настройки применяются ко всем пользователям, работающим с этим репозиторием.
Этот как раз тот самый .gitignore, в корне репозитория. В него стоит помещать в основном только то, что имеет непосредсвенное отношение к проекту и его архитектуре. Например, у всех участников проекта есть директория с локальными данными или паролями, или у всех в одном и том же месте создаются временные файлы. Если эти правила имеют отношение ко всем участникам проекта - то стоит правила игнорирования разместить в .gitignore, который будет распространяться вместе с репозиторием.
Когда то давно я думал что у всех собственный .gitignore и он не должен комитится, но оказывается что должен, чтобы у всех участников проекта были в игноре одни и те же файлы и папки.
Настройка gitignore на уровне пользователя
Этот подход позволяет пользователю игнорировать файлы и директории в Git исключительно для своей локальной рабочей копии репозитория. Это полезно, если нужно исключить из индексации временные файлы, генерируемые лично этим пользователем (например, файлы редакторов, локальные сборки, логи и т. д.), не затрагивая настройки других участников проекта.
Основные преимущества использования .git/info/exclude:
- Локальность: Этот файл действует только в текущем репозитории на локальной машине и не распространяется на других пользователей.
- Изоляция: Настройки игнорирования остаются приватными и не влияют на совместную работу в репозитории.
Такой подход подходит для пользователей, которые хотят сохранить свои локальные настройки, не нарушая общие соглашения команды.
Примеры написания правил и исключений в файле gitignore
Правила в .gitignore могут быть как простыми, так и сложными, что позволяет точно настраивать поведение Git.
Ниже приведены примеры различных правил игнорирования файлов в Git и их объяснение:
# комментарий — эта строка игнорируется
# не обрабатывать файлы, имя которых заканчивается на .a
*.a
# НО отслеживать файл lib.a, несмотря на то, что мы игнорируем все .a файлы с помощью предыдущего правила
!lib.a
# игнорировать только файл TODO находящийся в корневом каталоге, не относится к файлам c таким же названиях в подкаталогах к примеру subdir/TODO
/TODO
# игнорировать все файлы в каталоге build/
build/
# игнорировать doc/notes.txt, но не doc/server/arch.txt
doc/*.txt
# игнорировать все .txt файлы в каталоге doc/ и его подкаталогов
doc/**/*.txtВ файле .gitignore нужно указывать относительные пути. Эти пути указываются относительно корневого каталога вашего репозитория (той директории, где находится папка .git).
Игнорировать файл или папку в корневой директории:
secret.txt
/build/
Это игнорирует файл secret.txt и папку build, которые находятся в корне репозитория.
Что делать если после добавления в gitignore файлы всеравно продолжают отслеживаться
Если вы добавили папку в .gitignore, но git status всё ещё показывает изменения в файлах этой папки, это происходит потому, что Git уже отслеживает эти файлы (то есть они были добавлены в репозиторий до того, как вы внесли их в .gitignore).
Git не перестанет отслеживать файлы автоматически, если они уже были добавлены. Чтобы исправить это, нужно выполнить несколько шагов:
1. Прекратить отслеживание файлов, которые уже находятся в репозитории
Используйте команду git rm с флагом --cached, чтобы удалить файлы из индекса (то есть прекратить их отслеживание), не удаляя их физически с диска:
git rm -r --cached имя_папки/
Эта команда удалит все файлы из указанной папки из индекса (индекс — это область, где Git хранит информацию о том, какие файлы отслеживаются). Файлы останутся на диске, но Git перестанет их отслеживать.
2. Закоммитить изменения
После того как вы прекратите отслеживание файлов, вам нужно закоммитить изменения:
git commit -m "Stopped tracking папка"
Теперь Git перестанет отслеживать файлы в этой папке и .gitignore начнёт работать для этой папки правильно.
Временно игнорировать изменения в файле
В Git существует команда, которая позволяет временно прекратить отслеживание изменений в уже отслеживаемом файле.
При использовании этой команды для конкретного файла, Git будет “предполагать”, что этот файл остаётся неизменным, и не будет отображать его в списке изменённых файлов при выполнении команды git status, даже если в файл были внесены локальные изменения.
Это полезно, когда необходимо изменить файл только для локальной работы, не затрагивая основную версию в файла в репозитории
Временно игнорировать изменения в файле можно командой:
git update-index --assume-unchanged <file>
Отключается командой:
git update-index --no-assume-unchanged <file>
Полезные команды связанные с игнорированием файлов в репозитории
Просмотреть что в файле .gitignore на уровне репозитория
git status --ignored