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

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



但是当我删除前导斜杠时会发生什么?据我了解,有两种情况:

  • 如果模式不包含斜杠(或者它只包含一个尾部斜杠,这意味着它应该匹配一个目录),则在整个目录树中执行搜索。例如,模式 dir/ 将匹配 <root>/dir<root>/a/dir<root>/a/b/c/.../dir 等,其中 <root> 等,其中 0x25181223131318131314313 的文件位置
  • 如果模式包含斜杠,它不在尾随位置(不是最后一个字符),那么它只与相对于 .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 忽略了这两个 .gitignore 目录。这与第 1 种情况一致:模式没有斜杠(结尾的除外),因此 Git 正在监视整个目录树,忽略与模式匹配的所有内容。

    第二次测试:
    # .gitignore
    /dir/
    
    # git status
    Untracked files:
        src/
    

    在这里,由于模式中的前导斜杠,Git 只忽略了根目录正下方的 0x25181231343141 目录。

    第三次测试:
    # .gitignore
    dir/*
    
    # git status
    Untracked files:
        src/
    

    这与第 2 种情况一致:模式内部有一些斜杠,因此它被视为从根目录开始的路径名。

    现在是真正的问题的时候了。让我们考虑 this gitignore file :例如,当他们忽略目录 dir 时,他们实际上是否忽略了在整个目录树中找到的每个 dir 目录?自从我之前看到 Git 的工作原理以来,这就是我一直在思考的问题。

    因此,如果我碰巧有一个自定义模块,其中包含一个 downloader/ 目录,它会不会像 Magento 根目录中的常规模块一样被意外忽略?这是一个有点理所当然的问题,因为它实际上已经发生在我身上,产生了一个很难找到的错误。

    所以,在 Magento downloader 文件(我只是作为一个例子,顺便说一句)中,很多模式都包含斜杠,所以它们与从根开始的路径名正确匹配,但有一些情况,比如 downloader.gitignore ,如果我没记错的话,有潜在危险,可能应该改为 downloader/errors/

    作为一个更普遍的问题,当我想从根显式地选择一个路径名而不将它用于包含斜杠的模式时,我是否应该始终将前导斜杠用于不包含斜杠的模式(尾随除外),或者我应该为了清楚起见,总是使用前导斜杠?你怎么看待这件事?

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

    最佳答案

    只是想总结一下以备将来可能的快速引用——前导斜杠将匹配 anchor 定到根。因此,在下面的示例中,如果没有斜线,通配符也将排除 foo 中的所有内容,因为它需要 * 并沿树递归向下移动。但是,对于 /* ,它排除了文件夹 foo 及其内容以外的所有内容:

    $ cat .gitignore
    /*
    !/foo
    

    关于git - 何时在 gitignore 中使用前导斜杠,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24139478/

    10-13 08:36