Spec-Zone.ru › Git

gitignore

Имя

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

Обзор

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

Описание

Файл gitignore указывает намеренно неотслеживаемые файлы, которые Git должен игнорировать. На файлы, которые уже отслеживаются Git, это не влияет; подробности см. в разделе ПРИМЕЧАНИЯ ниже.

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

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

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

  • Шаблоны, прочитанные из $GIT_COMMON_DIR/info/exclude.

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

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

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

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

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

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

Формат шаблонов

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

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

  • Пробелы в конце строки игнорируются, если только они не экранированы обратным слэшем ("\").

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

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

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

  • Шаблоны, прочитанные из источников исключений вне рабочего дерева, таких как $GIT_COMMON_DIR/info/exclude и core.excludesFile, обрабатываются так, как будто они заданы в корне рабочего дерева, т. е. начальный слэш "/" в таких шаблонах привязывает совпадение к корню репозитория.

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

  • Например, шаблон 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_COMMON_DIR/info/exclude. Шаблоны из файла исключений используются в дополнение к шаблонам из $GIT_COMMON_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
    [...]
    # Untracked files:
    [...]
    #       Documentation/foo.html
    #       Documentation/gitignore.html
    #       file.o
    #       lib.a
    #       src/internal.o
    [...]
    $ cat .git/info/exclude
    # ignore objects and archives, anywhere in the tree.
    *.[oa]
    $ cat Documentation/.gitignore
    # ignore generated html files,
    *.html
    # except foo.html which is maintained by hand
    !foo.html
    $ git status
    [...]
    # Untracked files:
    [...]
    #       Documentation/foo.html
    [...]

Другой пример:

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

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

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

    $ cat .gitignore
    # exclude everything except directory foo/bar
    /*
    !/foo
    /foo/*
    !/foo/bar

Смотрите также

git-rm[1], gitrepository-layout[5], git-check-ignore[1]

gitignore

© 2005–2026 Linus Torvalds and others
Licensed under the GNU General Public License version 2.
https://git-scm.com/docs/gitignore

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API