gitignore:理解"你好/"与"你好/*"

sta*_*ser 18 git gitignore

hello/ 忽略我的文件夹结构中任何位置名为"hello"的所有文件夹

hello/* 只忽略顶层的文件夹"hello".

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

Pau*_*per 15

这可能看起来很困难,但这允许我们以多种方式匹配目录:任何地方的文件或目录,任何地方的目录或顶层的目录.这种多功能性非常有用,可以防止杂乱无章.gitignore.

(仅供参考,如果你有Git 1.8.2+,你可以git check-ignore用来帮助调试它.)


如果你放foo,它将匹配所有名为的文件和目录foo.


如果你放foo/,它只会匹配名为的目录foo.

如果模式以斜杠结尾,则为了以下描述的目的将其删除,但它只会找到与目录的匹配项.换句话说,foo /将匹配目录foo和它下面的路径,但是不匹配常规文件或符号链接foo(这与pathpec在Git中的工作方式一致).


如果你添加*,就像在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顶层的目录,但不管其他地方.


Von*_*onC 8

相关段落是:

Git将模式视为适合消费的shell glob fnmatch,具有:

  • ' *'为顶级文件
  • " **里面的一切,无限的深度

fnmatch是一个函数,它检查字符串参数是否与模式参数匹配,后者是一个shell通配符模式.

这从一个忽略不计的规则时,子文件夹是非常有用的,因为我在"提到如何将lib内部文件[/Libs/x64/Release]的Git仓库文件夹 "

Libs/**/*
!Libs/x64/Release/
Run Code Online (Sandbox Code Playgroud)

忽略除Libs/x64/Release文件夹之外的所有内容.

在任何情况下,该命令git check-ignore -v对于检查哪个.gitignore规则适用于任何特定文件非常有用.