Перейти к содержимому

.gitignore

Описание

В рабочей копии файлы видны Git как один из следующих типов: отслеживаемые, неотслеживаемые и игнорируемые.

Игнорируемые файлы — это файлы, которые Git было указано игнорировать. Обычно к ним относятся артефакты сборки, журналы, метаданные ОС и конфигурации IDE. Если вы хотите, чтобы эти файлы были зафиксированы, сначала они должны быть получены из исходного кода репозитория. Ниже приведены некоторые примеры игнорируемых Git файлов:

  • Файлы, которые генерируются во время выполнения (например, .log, .lock),
  • Скрытые системные файлы (.DS_Store, Thumbs.db),
  • Скомпилированный код (.o, .class) и так далее.

.gitignore

Шаблоны игнорирования Git

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

PatternExplanation
**/logsДвойные звёздочки используются для сопоставления каталогов в любом месте репозитория
**/logs/debug.logДвойные звёздочки используются для сопоставления файлов по их имени и имени родительского каталога.
*.logЗвёздочка сопоставляет ноль или более символов.
*.log !important.logВосклицательный знак инвертирует шаблон. Файл не будет игнорироваться, если он соответствует инвертирующему шаблону, определённому позже.
*.log !important/*.log trace.*Более поздний шаблон может снова сделать файл неигнорируемым, если он ранее был исключён из игнорирования, при условии, что он соответствует тому же файлу.
/debug.logКосая черта сопоставляет файлы только в корне репозитория.
debug.logПо умолчанию шаблоны сопоставляют файлы в любом каталоге.
debug?.logЗнак вопроса сопоставляет ровно один символ.
debug[0-9].logКвадратные скобки используются для сопоставления одного символа из определённого диапазона.
debug[01].logКвадратные скобки сопоставляют один символ из определённого набора.
debug[!01].logВосклицательный знак используется для сопоставления любого символа, кроме одного из определённого набора.
debug[a-z].logДиапазоны могут быть числовыми или буквенными.
logsШаблон будет сопоставлять как файлы, так и содержимое каталогов с таким именем, если он не используется вместе с косой чертой.
logs/Использование косой черты указывает, что шаблон является каталогом. Всё содержимое любого каталога с таким именем, включая его файлы и подкаталоги, в репозитории будет проигнорировано Git.
logs/**/debug.logДвойная звёздочка сопоставляет ноль или более каталогов.
logs/*day/debug.logЗвёздочки можно использовать и в именах каталогов.

Вот пример с одним из этих шаблонов:

Шаблоны .gitignore

bash
debug0.log
debug1.log
#but not
debug10.log

Общие файлы .gitignore в репозитории

Вы можете определить несколько файлов .gitignore в разных каталогах репозитория. Каждый из шаблонов проверяется относительно каталога, который содержит этот файл. Однако самый простой способ — определить один файл .gitignore в корне репозитория.

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

Личные правила игнорирования Git

Личные шаблоны игнорирования также можно определить для конкретного репозитория в специальном файле .git/info/exclude. Это подходящее место для шаблонов, полезных только вам, поскольку они не версионируются и не распространяются вместе с вашим репозиторием.

Глобальные правила игнорирования Git

Вы можете задать свойство Git core.excludesFile, чтобы дополнительно указать глобальные шаблоны игнорирования Git для всех репозиториев в вашей локальной системе. Этот файл вы создаёте сами. Вы можете поместить свой глобальный файл .gitignore в домашний каталог, чтобы его было легко найти. После создания файла настройте его расположение с помощью команды git config, например так:

global gitignore rules

bash
touch ~/.gitignore
git config --global core.excludesFile ~/.gitignore

Игнорирование ранее зафиксированного файла

Чтобы игнорировать файл, который был ранее зафиксирован, его следует удалить из репозитория. Затем нужно добавить для него правило .gitignore. С помощью опции --cached в git rm файл будет удалён из репозитория, но останется в рабочем каталоге как игнорируемый файл. Однако если вы хотите удалить его и из рабочего каталога, просто не указывайте опцию --cached.

.gitignore commited files

bash
echo debug.log >> .gitignore
git rm --cached debug.log
#rm 'debug.log'
git commit -m "Start ignoring debug.log"

Фиксация игнорируемого файла

Игнорируемый файл можно добавить в репозиторий с помощью комбинации параметра -f (или --force) и git add. Однако используйте этот способ, если у вас есть общее правило, например *.log, но вы хотите зафиксировать конкретный файл:

commiting ignored files

bash
cat .gitignore
# *.log
git add -f debug.log
git commit -m "Force adding debug.log"

Если нет, самый простой способ — задать исключение из общего правила:

commit ignored files

bash
echo '!debug.log' >> .gitignore

cat .gitignore
#*.log
#!debug.log

git add debug.log
git commit -m "Adding debug.log"

Сохранение в stash игнорируемого файла

Команда git stash забирает как незафиксированные подготовленные, так и неподготовленные изменения, сохраняет их для дальнейшего использования, а затем возвращает их в вашу рабочую копию. По умолчанию она игнорирует игнорируемые файлы и сохраняет в stash только изменения, отслеживаемые Git. Но параметр --all заставит эту команду сохранить изменения в игнорируемых и неотслеживаемых файлах.

Отладка файлов .gitignore

В случае сложных шаблонов .gitignore или при наличии нескольких файлов .gitignore бывает трудно понять, почему конкретный файл игнорируется. Команда git check-ignore с параметром -v (или --verbose) определяет, какой шаблон вызывает игнорирование конкретного файла:

git check ignored files

bash
git check-ignore -v debug.log
#.gitignore:3:*.log debug.log

Вот вывод:

git check-ignore

bash
<file containing the pattern> : <line number of the pattern> : <pattern> <file name>

Практика

Какие утверждения точно описывают функциональность и правила файлов `.gitignore` в Git?

Считаете ли это полезным?

Предпросмотр dual-run — сравните с маршрутами Symfony на продакшене.