gitignore:理解“你好/”与“你好/ *”

时间:2014-05-25 15:56:37

标签: git gitignore

hello/忽略名为" hello"的所有文件夹在我的文件夹结构中的任何地方

hello/*只会忽略文件夹"你好"在顶层。

这是为什么?请指出http://git-scm.com/docs/gitignore中解释此行为的段落。

2 个答案:

答案 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/dirfoo/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规则适用于任何特定文件非常有用。