何时在gitignore中使用前导斜杠

165

我正在尝试更清楚地了解 .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文件中(顺便说一下,我仅引用它作为例子),许多模式都包含斜杠,因此它们正确匹配从根目录开始的路径名,但是有一些情况,例如downloader/errors/,如果我没有弄错的话,可能是潜在的危险,应该改为/downloader//errors/

作为一个更一般的问题,当我想要显式选择从根目录开始的路径名而不是使用它来选择包含斜杠的模式时,我是否应始终对不包含斜杠的模式使用前导斜杠(除了末尾的斜杠),并且对包含斜杠的模式不使用前导斜杠?还是说我应该始终使用前导斜杠以获得清晰度?你怎么看?

谢谢阅读,对于这篇长文章感到抱歉。


13
非常好的问题和非常好的解释,我也曾被此困扰,你的研究让我明白了。阅读完这篇文章后,我认为如果路径应该从根目录开始,始终以斜杠开头是个好习惯,这样可以更清晰地表达意图。 - Martinsos
4
谢谢 :) 我同意你提到使用斜杠来更明确表达意图的注意事项。 - swahnee
8
这应该是.gitignore文档的一部分。这样更容易理解! - rmorrin
1
我很想看到这篇优秀的文章被分成问题和答案部分... - Barett
2个回答

41

为方便将来的快速参考,我想简要总结一下 - 前导斜杠将匹配锚定到根。因此,在下面的示例中,如果没有斜杠,则通配符还会排除foo内的所有内容,因为它会采用*并向下递归遍历树。然而,使用/*,它会排除除文件夹foo及其内容以外的所有内容:

$ cat .gitignore
/*
!/foo

2
好的,但是不完整。据我理解:任何非尾随斜杠(不仅仅是开头的)都会将匹配锚定到.gitignore所在的目录。 - pabouk - Ukraine stay strong

35

你已经完全回答了自己的问题。如果你仔细看一下github/gitignore库,你会发现大多数文件使用不一致的规则来编写模式;很可能这些文件是由那些没有阅读文档或像你一样测试过东西的人贡献的。

所以如果这有帮助的话:你是对的,要自信。

如果你在这样的合作项目中发现错误,不要犹豫,贡献你的知识吧。甚至还有一些先例,如果你需要进一步建立信心。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接