首页 > 解决方案 > .gitignore 中./(点斜线)的功能?

问题描述

我最近遇到了一个.gitignore 文件,它以 .gitignore 开头一些换行符./。我不知道那些./s 做了什么,我很惊讶地发现这既是 a) 一个看似新奇的问题,也是 b) 很难找到答案。

我看过这些 相关的问题,但是./在 gitignores 中的功能似乎与在 bash 终端中的功能不同。

我的测试似乎表明它./什么也没做。给定一个文件夹结构:

C:.
│   .gitignore
├───bar
│       bar0.txt
├───baz
│       baz0.txt
└───foo
        foo0.txt

还有一个 .gitignore

# .gitignore
./foo
./foo/*
./foo/
bar
/baz

如果我这样做git add -Agit status,则仅跟踪这些文件:

new file:   .gitignore
new file:   foo/foo0.txt

那么,这样做的目的是./什么?

编辑:我在 Windows 上。

标签: gitgitignore

解决方案


请记住,在 Windows(和 DOS)和 Unix(包括 macOS)中,文件路径中的单数点.指的是当前目录。

.gitignore文档中,相关点是:

  • 斜杠/用作目录分隔符。分隔符可能出现在.gitignore搜索模式的开头、中间或结尾。
  • 如果在模式的开头或中间(或两者)有分隔符,则该模式是相对于特定.gitignore文件本身的目录级别的。否则,模式也可能在低于该.gitignore级别的任何级别匹配。

所以:

  • foo

    • 将匹配foo在同一目录中命名的任何文件或目录以及与该文件相关的任何后代目录.gitignore
  • ./foo

    • foo 将仅匹配与文件在同一目录中命名的文件或目录.gitignore
    • 我注意到即使 git 手册说它匹配“文件或目录”,请记住这不是递归的 - 它也不匹配没有**glob 通配符的子文件夹(或其他子目录)中的文件。我不知道为什么手册git本身不存储与目录有关的任何信息-仅存储文件时,为什么会说“文件或目录”。
  • /foo

    • 行为与./foo.
  • ./foo/

    • 将仅匹配与文件foo 位于同一目录中的.gitignore目录。
  • /foo/

    • 行为与./foo/.

至于为什么有人用作./前缀而不是 just /,我只能推测,但一些原因可能是:

  • 他们想使用一种语法,让不熟悉.gitignore' 规则的读者立即清楚指定路径是相对于.gitignore文件目录的,因为/foo(没有前导.)可以解释为绝对路径(即文件系统绝对路径) ,尤其是在 Linux 上,例如/usr/bin- 或 git repo 中的绝对路径)
  • 他们.gitignore通过管道输出另一个程序或实用程序的输出来生成文件,该程序或实用程序.在其输出中使用了前导。
  • 他们自己不知道规则,这只是Cargo Cult 编程的一个例子(即以特定的方式做事(特别是当它很复杂时)而不理解他们为什么这样做,并且没有调查是否有必要)。

推荐阅读