我试图更清楚地理解.gitignore
语法,尤其是就https://github.com/github/gitignore gitignores而言。
我看到前导斜杠仅用于匹配相对于.gitignore
文件位置的路径名(来自http://git-scm.com/docs/gitignore):
前导斜杠与路径名的开头匹配。例如,“ / *。c”匹配“ cat-file.c”,但不匹配“ mozilla-sha1 / sha1.c”。
但是,当我删除前导斜杠时会发生什么?据我了解,有两种情况:
- 如果该模式不包含斜杠(或仅包含尾部斜杠,这意味着它应与目录匹配),则在整个目录树内执行搜索。例如,该图案
dir/
将匹配<root>/dir
,<root>/a/dir
,<root>/a/b/c/.../dir
等,其中<root>
是的位置.gitignore
的文件。 - 如果该模式包含斜杠(不在末尾)(不是最后一个字符),则仅与相对于
.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/
。
作为一个更普遍的问题,当我想从根目录开始显式选择路径名时,是否应该始终对不包含斜杠的模式使用前导斜杠(尾随除外),还是不应该将其用于包含斜杠的模式?始终使用前导斜线进行说明?你怎么看待这件事?
感谢您的阅读,对于冗长的帖子深表歉意。