何时在gitignore中使用前导斜杠

swa*_*nee 101 git gitignore

我试图更清楚地理解.gitignore语法,特别是对于https://github.com/github/gitignore gitignores而言.

我看到前导斜杠仅用于匹配相对于.gitignore文件位置的路径名(来自http://git-scm.com/docs/gitignore):

前导斜杠与路径名的开头匹配.例如,"/*.c"匹配"cat-file.c"但不匹配"mozilla-sha1/sha1.c".

但是当我删除主要斜线时会发生什么?据我所知,有两种情况:

  1. 如果模式不包含斜杠(或者它只包含一个尾部斜杠,这意味着它应该与目录匹配),则在整个目录树中执行搜索.例如,该图案dir/将匹配<root>/dir,<root>/a/dir,<root>/a/b/c/.../dir等,其中<root>是的位置.gitignore的文件.
  2. 如果模式包含斜杠,该斜杠不在尾随位置(它不是最后一个字符),则它仅与相对于.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)

  • 好的,但不完整。据我了解:任何*非尾随*斜杠(不仅仅是前导)都将匹配锚定到“.gitignore”的目录。 (2认同)

tne*_*tne 22

你完全回答了自己的问题.如果你仔细看看github/gitignore repo,你会发现大多数文件都使用了关于如何编写模式的不一致规则; 很可能大部分都是由那些懒得阅读文档而不是像你那样测试的人贡献的.

所以如果这有帮助:你是对的,要有信心.

如果你在这样的合作项目中看到错误,请不要犹豫,贡献你的知识.如果你需要进一步建立信心,甚至还有一些先例.