我正试图更清楚地理解 .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一致: 模式中有一些斜杠,因此它被认为是从根目录开始的路径名。
现在该问真正的问题了。让我们考虑一下 这个吉蒂诺档案: 例如,当它们忽略目录 downloader/
时,它们是否实际上忽略了在整个目录树中找到的每一个 downloader
目录?自从我之前看到 Git 的工作原理后,我就开始这么想了。
因此,如果我碰巧有一个自定义模块,其中包含一个 downloader
目录,这个模块会像 Magento 根目录中的常规模块一样被意外忽略吗?这是一个有点讽刺意味的问题,因为它实际上已经发生在我身上,产生了一个非常难以找到的 bug。
因此,在 Magento .gitignore
文件中(我只是作为一个例子提到) ,很多模式包含斜杠,所以它们与从根目录开始的路径名正确匹配,但是有一些情况,如 downloader/
或 errors/
,如果我没有弄错,是潜在的危险,它们可能应该更改为 /downloader/
和 /errors/
。
作为一个更一般的问题,当我想要显式地从 root 开始选择一个路径名,而不是用它来选择包含斜杠的模式时,我是否应该总是使用前斜杠来表示不包含斜杠的模式(除了后面的那个) ,或者为了清晰起见,我是否应该总是使用前斜杠?你觉得怎么样?
感谢您的阅读,并为长期职位抱歉。