我试图更清楚地理解.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.
Run Code Online (Sandbox Code Playgroud)
第一次测试:
# .gitignore
dir/
# git status
nothing to commit
Run Code Online (Sandbox Code Playgroud)
所以Git忽略了这两个dir
目录.这与案例编号1一致:模式没有斜杠(除了尾部),因此Git正在观察整个目录树,忽略与模式匹配的所有内容.
第二次测试:
# .gitignore
/dir/
# git status
Untracked files:
src/
Run Code Online (Sandbox Code Playgroud)
在这里,dir
由于模式中的前导斜杠,Git只忽略根目录下的目录.
第三次测试:
# .gitignore
dir/*
# git status
Untracked files:
src/
Run Code Online (Sandbox Code Playgroud)
这与第2个案例一致:模式中包含一些斜杠,因此它被视为从根目录开始的路径名.
现在是真正问题的时候了.让我们考虑一下这个gitignore文件:downloader/
例如,当他们忽略该目录时,他们是否真的忽略downloader
了整个目录树中的每个目录?这就是我之前想到的,因为我之前看到过Git的工作.
所以,如果我碰巧有一个自定义模块,downloader
里面有一个目录,它是否会被意外地忽略,以及Magento根目录中的常规模块?这有点像一个反复的问题,因为它实际上已经发生在我身上,产生了一个非常难以找到的bug.
所以,在Magento .gitignore
文件中(我只是作为一个例子,btw),很多模式都包含斜杠,因此它们与从根开始的路径名正确匹配,但是有一些情况,比如downloader/
或者errors/
那个,如果我没有弄错的话,是有潜在危险的,应该更改为/downloader/
和/errors/
.
作为一个更普遍的问题,当我想从root显式选择一个路径名,而不是将它用于包含斜杠的模式时,我应该总是使用不包含斜杠的模式的前导斜杠(除了尾部),或者我应该使用它为了清晰起见,总是使用前导斜线?你怎么看待这件事?
感谢您阅读并抱歉这篇长篇文章.
sol*_*333 23
只是想总结一下可能的快速未来参考 - 领先的斜杠将匹配锚定到根.因此,在下面的示例中,没有斜杠,通配符也会排除foo中的所有内容,因为它将*
沿树递归递送.然而,有了/*
它,它排除了除文件夹foo及其内容之外的所有内容:
$ cat .gitignore
/*
!/foo
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
11154 次 |
最近记录: |