Многоуровневая система игнорирования файлов в Git

Игнорирование файлов в репозитории можно настроить на нескольких уровнях, каждый из которых имеет свои особенности:

  1. Глобальный уровень: Игнорирование файлов для всех репозиториев на компьютере. Это настраивается в конфигурационном файле, который распространяется на все репозитории пользователя.

  2. Уровень репозитория: Игнорирование файлов для конкретного репозитория, которое распространяется на всех пользователей, работающих с этим проектом. Настройки хранятся в файле .gitignore, который находится в корневой папке репозитория.

  3. Уровень пользователя: Игнорирование файлов только для конкретного пользователя и его рабочей директории в репозитория. Эти настройки задаются через файл .git/info/exclude, который не включается в контроль версий и доступен только локально для данного пользователя.

Такая многоуровневая система позволяет гибко управлять исключениями файлов из версионного контроля в зависимости от ваших нужд.

Настройка gitignore на глобальном уровне

Нужно создать файл .gitignore такой же как мы создаем в каждом репозитории. Обычно его создают в домашнем каталоге, но можно в любом месте на компьютере

После создания файла, нужно сообщить системе Git где находится глобальный gitignore

git config --global core.excludesfile <путь_к_файлу>/.gitignore

Настройки gitignore на уровне репозитория

Файл .gitignore — это правило для всех участников проекта, которое указывает системе Git, какие файлы следует игнорировать в репозитории. Эти настройки применяются ко всем пользователям, работающим с этим репозиторием.

Этот как раз тот самый .gitignore, в корне репозитория. В него стоит помещать в основном только то, что имеет непосредсвенное отношение к проекту и его архитектуре. Например, у всех участников проекта есть директория с локальными данными или паролями, или у всех в одном и том же месте создаются временные файлы. Если эти правила имеют отношение ко всем участникам проекта - то стоит правила игнорирования разместить в .gitignore, который будет распространяться вместе с репозиторием.

Когда то давно я думал что у всех собственный .gitignore и он не должен комитится, но оказывается что должен, чтобы у всех участников проекта были в игноре одни и те же файлы и папки.

Настройка gitignore на уровне пользователя

Этот подход позволяет пользователю игнорировать файлы и директории в Git исключительно для своей локальной рабочей копии репозитория. Это полезно, если нужно исключить из индексации временные файлы, генерируемые лично этим пользователем (например, файлы редакторов, локальные сборки, логи и т. д.), не затрагивая настройки других участников проекта.

Основные преимущества использования .git/info/exclude:

  1. Локальность: Этот файл действует только в текущем репозитории на локальной машине и не распространяется на других пользователей.
  2. Изоляция: Настройки игнорирования остаются приватными и не влияют на совместную работу в репозитории.

Такой подход подходит для пользователей, которые хотят сохранить свои локальные настройки, не нарушая общие соглашения команды.

Примеры написания правил и исключений в файле 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