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

Gitignore: Понимание "hello/" vs. "hello/*"

hello/ игнорирует все папки с именем "hello" в любой папке структуры

hello/* только игнорирует папку "привет" на верхнем уровне.

Почему это? Укажите http://git-scm.com/docs/gitignore, который объясняет это поведение.

4b9b3361

Ответ 1

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

(FYI, если у вас есть Git 1.8.2+, вы можете использовать git check-ignore, чтобы помочь отладить это.)


Если вы поместите foo, он будет соответствовать всем файлам и каталогам с именем foo.


Если вы поместите foo/, он будет соответствовать только каталогам с именем foo.

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


Если вы добавите *, как в foo/*, он рассматривается как файл glob (относительно .gitignore).

В противном случае Git рассматривает шаблон как оболочку оболочки, подходящую для использования fnmatch (3) с флагом FNM_PATHNAME: подстановочные знаки в шаблоне не совпадают с/в пути. Например, "Documentation/*. Html" соответствует "Documentation/git.html", но не "Documentation/ppc/ppc.html" или "tools/perf/Documentation/perf.html".

Таким образом, для foo/*, Git будет игнорировать все файлы и каталоги в каталоге верхнего уровня foo. Он будет игнорировать foo/dir, foo/file.txt и т.д. (Технически это не будет игнорировать сам foo, но он будет игнорировать его дочерние элементы. Однако, поскольку Git не отслеживает каталоги, он имеет тот же эффект.)

FYI, foo/** будет иметь такое же поведение.


Моя рекомендация:

Если вы хотите игнорировать каталог foo на верхнем уровне, IMO, это наиболее очевидно использовать это правило:

Ведущая косая черта соответствует началу пути. Например, "/*.c" соответствует "cat-file.c", но не "mozilla-sha1/sha1.c".

Итак, вы можете написать /foo/, и он будет игнорировать каталог foo на верхнем уровне, но нигде больше.

Ответ 2

Соответствующий отрывок:

Git рассматривает шаблон как оболочку, подходящую для потребления, fnmatch, с помощью:

  • '*' для верхних файлов
  • '**' все внутри, с бесконечной глубиной

fnmatch - это функция, которая проверяет, соответствует ли аргумент строки аргументу шаблона, который является шаблоном шаблона оболочки.

Это полезно, если исключить вложенные папки из правила игнорирования, как я упоминал в Как включить файлы lib внутри папки [/Libs/x64/Release] в репозитории Git "

Libs/**/*
!Libs/x64/Release/

Это игнорирует все, кроме папки Libs/x64/Release.

В любом случае команда git check-ignore -v очень полезна для проверки того, какое правило .gitignore применяется для любого конкретного файла.