hello/
игнорирует все папки с именем "hello" в любой папке структуры
hello/*
только игнорирует папку "привет" на верхнем уровне.
Почему это? Укажите http://git-scm.com/docs/gitignore, который объясняет это поведение.
hello/
игнорирует все папки с именем "hello" в любой папке структуры
hello/*
только игнорирует папку "привет" на верхнем уровне.
Почему это? Укажите http://git-scm.com/docs/gitignore, который объясняет это поведение.
Это может показаться странным, но это позволяет нам сопоставлять каталоги несколькими способами: файлами или каталогами в любом месте, каталогами в любом месте или каталогами на верхнем уровне. Эта универсальность очень полезна и может препятствовать загромождению .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
на верхнем уровне, но нигде больше.
Соответствующий отрывок:
Git рассматривает шаблон как оболочку, подходящую для потребления,
fnmatch
, с помощью:
*
' для верхних файлов**
' все внутри, с бесконечной глубинойfnmatch - это функция, которая проверяет, соответствует ли аргумент строки аргументу шаблона, который является шаблоном шаблона оболочки.
Это полезно, если исключить вложенные папки из правила игнорирования, как я упоминал в Как включить файлы lib
внутри папки [/Libs/x64/Release]
в репозитории Git "
Libs/**/*
!Libs/x64/Release/
Это игнорирует все, кроме папки Libs/x64/Release
.
В любом случае команда git check-ignore -v
очень полезна для проверки того, какое правило .gitignore
применяется для любого конкретного файла.