我正在尝试更清楚地了解 .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
文件中(顺便说一下,我仅引用它作为例子),许多模式都包含斜杠,因此它们正确匹配从根目录开始的路径名,但是有一些情况,例如downloader/
或errors/
,如果我没有弄错的话,可能是潜在的危险,应该改为/downloader/
和/errors/
。
作为一个更一般的问题,当我想要显式选择从根目录开始的路径名而不是使用它来选择包含斜杠的模式时,我是否应始终对不包含斜杠的模式使用前导斜杠(除了末尾的斜杠),并且对包含斜杠的模式不使用前导斜杠?还是说我应该始终使用前导斜杠以获得清晰度?你怎么看?
谢谢阅读,对于这篇长文章感到抱歉。