什么时候在gitignore中使用引导斜线

我试图更清楚地了解.gitignore语法,特别是就https://github.com/github/gitignore gitignore而言。

我发现前面的斜线用于匹配相对于.gitignore文件的位置的path名(来自http://git-scm.com/docs/gitignore ):

前导斜杠匹配path名的开头。 例如,“/*.c”与“cat-file.c”匹配,但不匹配“mozilla-sha1 / sha1.c”。

但是,当我删除主要斜杠会发生什么? 据我所知,有两种情况:

  1. 如果该模式不包含斜线(或者它只包含一个尾部斜线,意味着它应该匹配一个目录),则在整个目录树内执行search。 例如,模式dir/将匹配<root>/dir<root>/a/dir<root>/a/b/c/.../dir等,其中<root>.gitignore文件。
  2. 如果模式中包含斜线(不在尾部位置(不是最后一个字符)),则仅与相对于.gitignore文件位置的path名相匹配。

这些是我做的检查这个行为的例子:

 # Directory structure: <root> |- dir/ | |- test |- src/ | |- dir/ | | |- test test file is there only because Git does not track empty directories. 

第一个testing:

 # .gitignore dir/ # git status nothing to commit 

所以Git忽略了这两个dir目录。 这与案例1是一致的:模式没有斜线(除了尾部),所以Git正在观察整个目录树,忽略与模式匹配的所有内容。

第二个testing:

 # .gitignore /dir/ # git status Untracked files: src/ 

在这里,Git只忽略了根目录下的dir目录,这要归功于模式中的前导斜杠。

第三个testing:

 # .gitignore dir/* # git status Untracked files: src/ 

这与案例2一致:模式内部有一些斜线,所以它被认为是从根目录开始的path名。

现在是真正的问题了。 让我们考虑这个gitignore文件 :当他们忽略目录downloader/ ,例如,他们是不是实际上忽略了在整个目录树中find的每一个downloader目录? 这就是我之前所看到的有关Git工作原理的想法。

所以,如果我碰巧有一个自定义模块,其中包含一个downloader目录,它会被意外地忽略,以及在Magento根中的常规模块? 这是一个反复的问题,因为它实际上已经发生在我身上,产生了一个很难find的错误。

所以,在Magento .gitignore文件(我只是作为一个例子,顺便说一句),很多模式包含斜线,所以他们正确匹配的path名从根开始,但也有一些情况下,像downloader/errors/如果我没有弄错,是否有潜在的危险,哪些可能应该更改为/downloader//errors/

作为一个更一般的问题,当我想从根开始显式地select一个path名,而不是把它用于包含斜线的模式时,我应该总是使用前导斜线来表示不包含斜线的模式(除了尾部的)总是使用主导斜线清晰? 你怎么看待这件事?

感谢您阅读和长期发帖抱歉。

你已经完全回答了你自己的问题。 如果你仔细看看github / gitignore repo,你会发现大多数文件使用不一致的规则来写模式。 很可能大部分是由于不愿意阅读文档或者像以前那样testing的人而贡献的。

所以,如果有帮助:你是对的,有信心。

如果你在这样的合作项目中看到错误,请不要犹豫提供你的知识。 如果你需要进一步build立你的信心,甚至有一个先例 。

只是想总结一下可能的快速参考 – 主导斜线将匹配锚定到根。 因此,在下面的示例中,如果没有斜杠,通配符也将排除foo内的所有内容,因为它将采用*并recursion地向下移动树。 但是,使用/* ,它将排除除foo文件夹及其内容之外的所有内容:

 $ cat .gitignore /* !/foo