.gitignore subdir / *和subdir /有什么区别?

时间:2018-09-15 23:40:06

标签: git

test/test/build64/ALL_BUILD.vcxproj

上面的文件将使用以下模式忽略:

build64/ 

但是,以下模式不起作用。

build64/*

1 个答案:

答案 0 :(得分:2)

关键区别在于build64中没有斜杠。

我知道您实际上写过build64/build64/*,并且build64/ 确实中有斜线,但是build64 确实没什么,这就是所有不同的原因。

查看the gitignore documentation,然后向下扫描到以 PATTERN FORMAT (样式)为标题的部分。请注意以以下内容开头的要点:

  
      
  • 如果图案以斜杠结尾,则出于以下描述的目的将其删除...
  •   

我认为本文的其余部分非常令人困惑-令人困惑-但是这里的关键是build64/的结尾斜杠先被删除了,所以它不会再加一个斜线。因此,现在,如果Git遇到名为test/test/build64/ALL_BUILD.vcxproj的文件,则Git将该名称分为四个文件名组成部分

  • testtest中的第一个test/test);
  • testtest中的第二个test/test);
  • build64;和
  • ALL_BUILD.vcxproj

这四个组成部分中的任何一个都与build64相匹配吗?为什么是,第三个组件确实匹配build64。原始的build64带后缀斜杠,那么该组件是目录名称而不是文件名吗?是的,它是:因此test/test/build64/ALL_BUILD.vcxproj被规则build64/忽略,该规则不包含斜杠,但末尾的斜杠不计算在内。

另一方面,如果您写build64/*,则Git 不会删除斜杠,因此该模式包括一个斜杠。 Git完全像以前一样分解全名test/test/build64/ALL_BUILD.vcxproj,但是这一次,它要求 all 这些名称组成部分必须与 complete模式相匹配。 所有四个名称组成都与build64/*匹配吗?好吧,build64/*build64开头,名字部分为test不匹配,因此整个匹配立即失败。

请注意,如果您将test/test/build64/*写为.gitignore行,则Git将test/test/build64/ALL_BUILD.vcxprojtest/test/build64/*相匹配。现在,第一个组件test必须与test匹配(确实如此),第二个组件也必须与test匹配,当然它也要匹配。第三个成分必须与build64匹配,而最后一个成分ALL_BUILD.vcxproj必须与*匹配。所有这些要求都得到满足,因此该选择要关闭Git的文件以保持跟踪状态。

您还可以编写**/build64/*,因为**任意数量的前导组件匹配。这将匹配全名test/test/build64/ALL_BUILD.vcxproj,但也匹配build64/filefred/build64/wilmafred/wilma/build64/betty。请注意,它不会匹配fred/wilma/build64/barney/betty,因为barney/betty的组件太多–但是,如果您匹配目录fred/wilma/build64/barney,Git可能永远不会打扰 fred/wilma/build64/barney/内来查找betty

无论如何,重要的是要记住,除了**匹配项以外,一次一次完成一个文件名组件的shell样式匹配。 “所有必须匹配”规则由包含嵌入式斜杠的gitignore模式触发;否则,只有一个组件必须匹配。正如文档几乎所言,斜杠是

  

出于以下目的而被删除

决定使用“所有必须匹配”还是“仅一个必须匹配”规则。