Русский ▾ Topics ▾ Latest version ▾ gitignore last updated in 2.52.0

НАЗВАНИЕ

gitignore — Указывает намеренно неотслеживаемые файлы для игнорирования

ОБЗОР

$XDG_CONFIG_HOME/git/ignore, $GIT_DIR/info/exclude, .gitignore

ОПИСАНИЕ

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

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

  • Шаблоны, считанные из командной строки для тех команд, которые их поддерживают.

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

  • Шаблоны, считанные из $GIT_DIR/info/exclude.

  • Шаблоны, считанные из файла, указанного конфигурационной переменной core.excludesFile.

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

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

  • Шаблоны, специфичные для конкретного репозитория, но не требующие совместного использования с другими связанными репозиториями (например, вспомогательные файлы, находящиеся внутри репозитория, но специфичные для рабочего процесса одного пользователя), должны помещаться в файл $GIT_DIR/info/exclude.

  • Шаблоны, которые пользователь хочет, чтобы Git игнорировал во всех ситуациях (например, резервные копии или временные файлы, создаваемые выбранным редактором пользователя), обычно помещаются в файл, указанный core.excludesFile в ~/.gitconfig пользователя. Его значение по умолчанию — $XDG_CONFIG_HOME/git/ignore. Если $XDG_CONFIG_HOME не установлен или пуст, вместо этого используется $HOME/.config/git/ignore.

Низкоуровневые инструменты Git, такие как git ls-files и git read-tree, читают шаблоны gitignore, указанные в параметрах командной строки или из файлов, указанных в параметрах командной строки. Инструменты Git более высокого уровня, такие как git status и git add, используют шаблоны из источников, указанных выше.

ФОРМАТ ШАБЛОНА

  • Пустая строка не соответствует ни одному файлу, поэтому может служить разделителем для удобства чтения.

  • Строка, начинающаяся с #, служит комментарием. Для шаблонов, начинающихся с решётки, поставьте обратную косую черту ("\") перед первой решёткой.

  • Завершающие пробелы игнорируются, если они не экранированы обратной косой чертой ("\").

  • Необязательный префикс "!", который инвертирует шаблон; любой файл, соответствующий шаблону и исключённый предыдущим шаблоном, снова будет включён. Невозможно повторно включить файл, если родительский каталог этого файла исключён. Git не перечисляет исключённые каталоги по соображениям производительности, поэтому любые шаблоны для содержащихся файлов не имеют эффекта, независимо от того, где они определены. Поставьте обратную косую черту ("\") перед первым "!" для шаблонов, которые начинаются с буквального "!", например, "\!important!.txt".

  • Косая черта "/" используется как разделитель каталогов. Разделители могут встречаться в начале, середине или конце шаблона поиска .gitignore.

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

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

  • Например, шаблон doc/frotz/ соответствует каталогу doc/frotz, но не каталогу a/doc/frotz; однако frotz/ соответствует frotz и a/frotz, если это каталог (все пути отсчитываются относительно файла .gitignore).

  • Звёздочка "*" соответствует любому символу, кроме косой черты. Символ "?" соответствует любому одному символу, кроме "/". Можно использовать нотацию диапазона, например [a-zA-Z], для соответствия одному из символов в диапазоне. См. fnmatch(3) и флаг FNM_PATHNAME для более подробного описания.

  • Обратная косая черта ("\") может использоваться для экранирования любого символа. Например, "\*" соответствует буквальной звёздочке (а "\a" соответствует "a", хотя там нет необходимости в экранировании). Как и в fnmatch(3), обратная косая черта в конце шаблона является недопустимым шаблоном, который никогда не совпадает.

Две последовательных звёздочки («**») в шаблонах, сопоставленных с полным именем пути, могут иметь особое значение:

  • Начальные «**», после которых идёт слэш (/) означают сопоставление во всех каталогах. Например, шаблон «**/foo» будет сопоставлять файл или каталог «`foo» в любом месте, точно также как и шаблон «foo». А шаблон "**/foo/bar" будет сопоставлять файл или каталог "bar" в каталоге "foo", который в свою очередь уже может находится в любом месте.

  • Завершающий "/**" соответствует всему внутри. Например, "abc/**" соответствует всем файлам внутри каталога "abc" относительно местоположения файла .gitignore с бесконечной глубиной.

  • Слэш после которого идут две последовательные звёздочки, а затем ещё один слэш сопоставляется нулю или более каталогов. Например, шаблону «a/**/b» будут сопоставляться «a/b», «a/x/b», «a/x/y/b» и т.д.

  • Другие последовательные звёздочки считаются обычными звёздочками и будут соответствовать предыдущим правилам.

КОНФИГУРАЦИЯ

Необязательная конфигурационная переменная core.excludesFile указывает путь к файлу, содержащему шаблоны имён файлов для исключения, аналогично $GIT_DIR/info/exclude. Шаблоны в файле исключений используются в дополнение к шаблонам в $GIT_DIR/info/exclude.

ЗАМЕТКИ

Цель файлов gitignore — обеспечить, чтобы определённые файлы, не отслеживаемые Git, оставались неотслеживаемыми.

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

Git не следует символическим ссылкам при доступе к файлу .gitignore в рабочем дереве. Это обеспечивает согласованное поведение при доступе к файлу из индекса или дерева по сравнению с файловой системой.

ПРИМЕРЫ

  • Шаблон hello.* соответствует любому файлу или каталогу, имя которого начинается с hello.. Если нужно ограничить это только каталогом, а не его подкаталогами, можно добавить косую черту перед шаблоном, т.е. /hello.*; теперь шаблон соответствует hello.txt, hello.c, но не a/hello.java.

  • Шаблон foo/ будет соответствовать каталогу foo и путям под ним, но не будет соответствовать обычному файлу или символической ссылке foo (это согласуется с тем, как pathspec работает в целом в Git)

  • Шаблоны doc/frotz и /doc/frotz имеют одинаковый эффект в любом файле .gitignore. Другими словами, начальная косая черта не имеет значения, если в шаблоне уже есть косая черта в середине.

  • Шаблон foo/* соответствует foo/test.json (обычный файл), foo/bar (каталог), но не соответствует foo/bar/hello.c (обычный файл), так как звёздочка в шаблоне не соответствует bar/hello.c, который содержит косую черту.

    $ git status
    [...]
    # Неотслеживаемые файлы:
    [...]
    #       Documentation/foo.html
    #       Documentation/gitignore.html
    #       file.o
    #       lib.a
    #       src/internal.o
    [...]
    $ cat .git/info/exclude
    # игнорировать объекты и архивы, где угодно в дереве.
    *.[oa]
    $ cat Documentation/.gitignore
    # игнорировать сгенерированные html файлы,
    *.html
    # кроме foo.html, который поддерживается вручную
    !foo.html
    $ git status
    [...]
    # Неотслеживаемые файлы:
    [...]
    #       Documentation/foo.html
    [...]

Ещё пример:

    $ cat .gitignore
    vmlinux*
    $ ls arch/foo/kernel/vm*
    arch/foo/kernel/vmlinux.lds.S
    $ echo '!/vmlinux*' >arch/foo/kernel/.gitignore

Второй .gitignore предотвращает игнорирование Git’ом arch/foo/kernel/vmlinux.lds.S.

Пример исключения всего, кроме определённого каталога foo/bar (обратите внимание на /* — без косой черты подстановочный знак также исключил бы всё внутри foo/bar):

    $ cat .gitignore
    # исключить всё, кроме каталога foo/bar
    /*
    !/foo
    /foo/*
    !/foo/bar

СМОТРИТЕ ТАКЖЕ

GIT

Является частью пакета git[1]