Подтвердить что ты не робот

Разница между правилами .gitignore с и без конечной косой черты типа /dir и/dir/

Есть ли разница между /dir и /dir/ в файле .gitignore в репозитории Git?

Как выглядят следующие разные?

/dir
/dir/
/dir/*
4b9b3361

Ответ 2

Это старый вопрос, но высокий рейтинг в Google и верхний проголосовавший ответ неправильный. Вот правильный ответ.

Да, эти правила разные.

  • /dir будет соответствовать файлу, директории, ссылке, всем, что называется dir
  • /dir/ будет соответствовать только директории с именем dir
  • /dir/* будет соответствовать всем файлам, каталогам и всем остальным внутри каталог с именем dir (но не сам каталог dir).

/dir, /dir/ и /dir/* эквивалентны НЕ. Разница очень понятна при использовании переопределяющих правил, таких как знаменитый !.gitkeep чтобы обойти ограничение отслеживания пустых каталогов. предполагать существование файла dir/.gitkeep

  • С /dir и /dir/, Git даже не заглянет внутрь каталога поэтому .gitkeep не будет выглядеть.
  • С /dir/* файл будет обнаружен Git, а каталог будет сохранено, если этот .gitkeep зафиксирован, потому что правило не относится к самому каталогу, только к его содержимому.

OBS: все перечисленные выше правила привязаны к текущему каталогу (место, где находится .gitignore), из-за префикса /. Без префикса правила будут применяться не только для этого конкретного каталога, но также для подкаталогов или повсюду в репозитории, если .gitignore находится на корневом уровне.

Ответ 3

Шаблоны имеют разные значения

В соответствии с разделом Формат шаблона gitignore (5):

  • Если шаблон заканчивается косой чертой, он удаляется для целей следующего описания, но он будет находить совпадение с каталогом. Другими словами, foo/будет соответствовать каталогу foo и paths под ним, но не будет соответствовать регулярному файлу или символической ссылке foo (это согласуется с тем, как pathspec работает вообще в git).

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

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

Ответ 4

Git 2.23 (Q3 2019) пытается обновить описание слэшей в шаблонах gitignore (используется для обозначения таких вещей, как "привязанный только к этому уровню" и "только соответствует каталогам")

Документация теперь включает в себя:

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

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

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

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

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