何时在gitignore中使用前导斜线


108

我试图更清楚地理解.gitignore语法,尤其是就https://github.com/github/gitignore gitignores而言。

我看到前导斜杠仅用于匹配相对于.gitignore文件位置的路径名(来自http://git-scm.com/docs/gitignore):

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

但是,当我删除前导斜杠时会发生什么?据我了解,有两种情况:

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

这些是我用来检查此行为的示例:

# Directory structure:
<root>
├─ dir/
│   └─ test
├─ src/
│   ├─ dir/
│   │   └─ test
test file is there only because Git does not track empty directories.

第一次测试:

# .gitignore
dir/

# git status
nothing to commit

因此,Git忽略了这两个dir目录。这与案例1一致:模式没有斜杠(末尾的斜杠除外),因此Git正在监视整个目录树,而忽略了与模式匹配的所有内容。

第二次测试:

# .gitignore
/dir/

# git status
Untracked files:
    src/

在这里,Git只忽略了 dir由于模式中的前导斜线了根目录正下方的目录。

第三次测试:

# .gitignore
dir/*

# git status
Untracked files:
    src/

这与案例编号2一致:模式内部有一些斜杠,因此将其视为从根目录开始的路径名。

现在是时候提出真正的问题了。让我们考虑这个gitignore文件downloader/例如,当他们忽略目录时,他们是否实际上忽略downloader了整个目录树中找到的每个目录?自从我之前对Git的工作了解以来,这就是我一直在思考的问题。

因此,如果我碰巧有一个带有 downloader目录,它会像Magento根目录中的常规一样被意外地忽略吗?这是一个与实际有关的问题,因为它实际上已经发生在我身上,产生了一个很难发现的错误。

所以,在Magento的.gitignore文件(我指的是仅仅作为一个例子,BTW)很多图案包含斜线,所以他们对正确从根开始的路径名匹配,但也有少数情况下,类似downloader/或者errors/说,如果我没记错的话,有潜在的危险,应该将其更改为/downloader//errors/

作为一个更普遍的问题,当我想从根目录开始显式选择路径名时,是否应该始终对不包含斜杠的模式使用前导斜杠(尾随除外),还是不应该将其用于包含斜杠的模式?始终使用前导斜线进行说明?你怎么看待这件事?

感谢您的阅读,对于冗长的帖子深表歉意。


8
很好的问题和非常好的解释,对此我也感到不安,您的研究使我明白了。读完这篇文章后,我会说,如果路径应该从根开始,则始终以斜线开头是个好习惯,这会使意图更加明显。
Martinsos 2014年

4
谢谢:)我同意您关于使用斜线使意图更明确的说明。
swahnee 2014年

8
这应该是.gitignore文档的一部分。更容易理解!
rmorrin

我很乐意看到这篇出色的文章分为问答部分……
Barett

Answers:


25

只是想总结一下,以备将来参考之用-斜杠将匹配项锚定到根。因此,在下面的示例中,如果没有斜线,通配符还将排除foo中的所有内容,因为它会*沿树递归地移动。但是,使用时/*,它将排除文件夹foo及其内容以外的所有内容:

$ cat .gitignore
/*
!/foo

24

您已经完全回答了自己的问题。如果您更仔细地查看github / gitignore仓库,您将看到大多数文件使用关于如何编写模式的不一致规则;它很可能是由那些不费心去阅读文档或像您一样进行测试的人提供的。

因此,如果这有帮助:您说对了,要自信。

如果您在诸如此类的协作项目中发现错误,请随时贡献您的知识。如果您需要进一步树立信心,甚至还有一些先例

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.