test/test/build64/ALL_BUILD.vcxproj
使用以下模式忽略上面的文件:
build64/
但是,下面的模式不起作用。
build64/*
最佳答案
关键区别在于build64
中没有斜线。
我知道你实际上写了build64/
和build64/*
,而且build64/
里面有斜线,但是build64
里面没有斜线,这就是区别。
查看the gitignore documentation并向下扫描到以模式格式为标题的部分。请注意以以下开头的要点:
如果模式以斜线结尾,则出于以下描述的目的将其删除…
我认为,文本的其余部分非常混乱,但这里的关键是build64/
首先删除了它的结束斜杠,这样它就不再有斜杠了。所以现在,如果git遇到一个名为test/test/build64/ALL_BUILD.vcxproj
的文件,git会将该文件名分成四个文件名组件,它们是:test
(第一个test
在test/test
中);test
(第二个test
在test/test
中);build64
;以及ALL_BUILD.vcxproj
。
这四个组件中有任何一个匹配吗?为什么是,第三个组件确实匹配build64
。原来的build64
有一个后缀斜杠,那么这个组件是目录名而不是文件名吗?是的,它是:因此build64
被规则test/test/build64/ALL_BUILD.vcxproj
忽略,该规则不包含斜杠,除了不计数的结束斜杠。
另一方面,如果您写build64/
,git不会删除斜杠,因此模式包含斜杠。git像以前一样分解全名build64/*
,但这次,它要求所有这些名称组件都匹配完整的模式。四个名称组件是否都匹配?好吧,test/test/build64/ALL_BUILD.vcxproj
以build64/*
开头,名字成分是build64/*
。这不匹配,因此整个匹配立即失败。
注意,如果您将build64
写为test
行,git将与test/test/build64/*
匹配。现在第一个组件必须匹配,第二个组件也必须匹配,当然它也匹配。第三个组件必须匹配.gitignore
,最后一个组件必须匹配test/test/build64/ALL_BUILD.vcxproj
。所有这些要求都得到满足,因此这将选择文件,使git对未跟踪的ness关闭。
您也可以编写test/test/build64/*
,因为test
匹配任何数量的主组件。这将匹配全名test
,但也匹配test
、build64
和ALL_BUILD.vcxproj
。注意,它不会匹配*
,因为**/build64/*
有太多组件,但是如果您匹配目录**
,git可能永远不会费心在test/test/build64/ALL_BUILD.vcxproj
中查找build64/file
。
在任何情况下,记住shell样式匹配是一次完成一个文件名组件,除了fred/build64/wilma
匹配之外,这一点很重要。“all must match”规则由包含嵌入斜杠的gitignore模式触发;否则只有一个组件必须匹配。正如文档中所说的,后面的斜杠是,
为了
决定是使用“all must match”规则还是“only one must match”规则。
关于git - .gitignore subdir/*和subdir/有什么区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52349749/