我试图更清楚地理解 .gitignore
语法,特别是 https://github.com/github/gitignore gitignores 很关心。
我看到前导斜杠仅用于匹配相对于 .gitignore
位置的路径名文件(来自 http://git-scm.com/docs/gitignore ):
A leading slash matches the beginning of the pathname. For example, "/*.c" matches "cat-file.c" but not "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 一致:该模式内部有一些斜线,因此它被认为是从根目录开始的路径名。
现在是真正的问题了。让我们考虑 this gitignore file : 当他们忽略目录时 downloader/
,例如,他们不是真的忽略了每一个downloader
吗?在整个目录树中找到的目录?自从我之前看到 Git 的工作原理以来,这就是我的想法。
所以如果我碰巧有一个带有 downloader
的自定义模块它里面的目录,它会像Magento根目录中的常规目录一样被意外忽略吗?这是一个有点反逻辑的问题,因为它实际上已经发生在我身上,产生了一个很难找到的错误。
所以,在 Magento .gitignore
文件(顺便说一句,我只是作为一个例子提到的)很多模式都包含斜线,所以它们与从根开始的路径名正确匹配,但也有一些情况,比如 downloader/
或 errors/
那,如果我没记错的话,是有潜在危险的,应该改为 /downloader/
和 /errors/
.
作为一个更一般的问题,当我想选择一个从根开始的路径名时,我是否应该始终对不包含斜杠的模式使用前导斜杠(尾随的斜杠除外),而不是将它用于包含斜杠的模式,还是为了清晰起见,我应该始终使用前导斜线?你怎么看?
感谢您的阅读,抱歉文章太长。
最佳答案
只是想总结一下以供将来可能的快速引用——前导斜线将匹配锚定到根。因此,在下面的示例中,如果没有斜线,通配符也会排除 foo 中的所有内容,因为它会采用 *
并递归地向下移动到树中。但是,对于 /*
,它排除了文件夹 foo 及其内容以外的所有内容:
$ cat .gitignore
/*
!/foo
关于git - 何时在 gitignore 中使用前导斜杠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24139478/