hello/
忽略名为" hello"的所有文件夹在我的文件夹结构中的任何地方
hello/*
只会忽略文件夹"你好"在顶层。
这是为什么?请指出http://git-scm.com/docs/gitignore中解释此行为的段落。
答案 0 :(得分:15)
这可能看起来很困难,但这允许我们以多种方式匹配目录:文件或目录,任何地方的目录或顶级目录。这种多功能性非常有用,可以防止杂乱.gitignore
。
(仅供参考,如果你有Git 1.8.2+,你可以使用git check-ignore
来帮助调试它。)
如果您放置foo
,它将匹配名为foo
的所有文件和目录。
如果你放foo/
,它只会匹配名为foo
的目录。
如果模式以斜杠结尾,则为了以下描述的目的将其删除,但它只会找到与目录的匹配项。换句话说,foo /将匹配目录foo和它下面的路径,但是不匹配常规文件或符号链接foo(这与在Git中一般使用pathspec的方式一致)。
如果您添加*
,就像foo/*
一样,它会被视为文件glob(相对于.gitignore
)。
否则,Git将模式视为适合fnmatch(3)使用FNM_PATHNAME标志的shell glob:模式中的通配符与路径名中的/不匹配。例如,“Documentation / * .html”匹配“Documentation / git.html”,但不匹配“Documentation / ppc / ppc.html”或“tools / perf / Documentation / perf.html”。
因此对于foo/*
,Git将忽略顶级目录foo
中的所有文件和目录。它将忽略foo/dir
,foo/file.txt
等。(从技术上讲,这不会忽略foo
本身,但它会忽略它的子节点。但是,由于Git不跟踪目录,它有同样的效果。)
仅供参考,foo/**
会有相同的行为。
我的建议:
如果您想忽略顶级目录foo
,IMO最明显的是使用此规则:
前导斜杠与路径名的开头匹配。例如,“/ *。c”匹配“cat-file.c”但不匹配“mozilla-sha1 / sha1.c”。
所以你可以写/foo/
,它会忽略顶层的foo
目录,但不管其他地方。
答案 1 :(得分:8)
相关段落是:
Git将模式视为适合
fnmatch
消费的shell glob,其中包含:
*
'对于顶级文件**
'里面的一切,无限深度fnmatch是一个函数,它检查字符串参数是否与模式参数匹配,后者是一个shell通配符模式。
在从忽略规则中排除子文件夹时很有用,正如我在" How to INCLUDE lib
files inside [/Libs/x64/Release]
folder in a Git repository"
Libs/**/*
!Libs/x64/Release/
忽略除Libs/x64/Release
文件夹以外的所有内容。
在任何情况下,命令 git check-ignore -v
对于检查哪个.gitignore
规则适用于任何特定文件非常有用。