何时在gitignore中使用前导斜杠

时间:2014-06-10 11:08:28

标签: 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文件位置的路径名匹配。
  3. 以下是我检查此行为的示例:

    # 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文件中(我只是作为一个例子,btw),很多模式都包含斜杠,因此它们与从根开始的路径名正确匹配,但是有一些情况,比如downloader/errors/,如果我没有弄错的话,有潜在的危险,应该更改为/downloader/和{{1} }}

    作为一个更普遍的问题,当我想从root显式选择一个路径名而不是将它用于包含斜杠的模式时,我是否应该总是使用不包含斜杠的模式的前导斜杠(除了尾部)或者为了清晰起见,我应该总是使用前面的斜线?你觉得怎么样?

    感谢您的阅读,并为长篇文章感到抱歉。

2 个答案:

答案 0 :(得分:18)

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

如果这有帮助:你是对的,要有信心。

如果您在此类协作项目中发现错误,请随时提供您的知识。如果你需要进一步建立信心,那么甚至会some precedent

答案 1 :(得分:17)

只是想总结可能的快速未来参考 - 领先的斜杠将匹配锚定到根。因此,在下面的示例中,没有斜杠,通配符也会排除foo中的所有内容,因为它将占用*并递归地向下移动到树中。但是,对于/*,它会排除除文件夹foo及其内容之外的所有内容:

$ cat .gitignore
/*
!/foo