Ответ 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
на верхнем уровне, но нигде больше.