./(点斜线)在 .gitignore 中的功能?

phl*_*xyr 2 git gitignore

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

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

我的测试似乎表明./它没有做任何事情。给定文件夹结构:

C:.
?   .gitignore
????bar
?       bar0.txt
????baz
?       baz0.txt
????foo
        foo0.txt
Run Code Online (Sandbox Code Playgroud)

和一个 .gitignore

# .gitignore
./foo
./foo/*
./foo/
bar
/baz
Run Code Online (Sandbox Code Playgroud)

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

new file:   .gitignore
new file:   foo/foo0.txt
Run Code Online (Sandbox Code Playgroud)

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

编辑:我在 Windows 上。

Dai*_*Dai 6

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

.gitignore文档中,相关要点是:

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

所以:

  • foo

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

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

    • 将与./foo.
  • ./foo/

    • 将仅匹配与文件foo 在同一目录中命名的目录.gitignore
  • /foo/

    • 将与./foo/.

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

  • 他们想要使用一种语法,让不熟悉.gitignore's 规则的读者立即清楚指定路径是相对于.gitignore文件目录的,因为/foo(没有前导.)可以解释为绝对路径(即文件系统绝对路径) ,尤其是在 Linux 上,例如/usr/bin- 或 git repo 中的绝对路径)
  • 他们.gitignore通过管道从另一个程序或实用程序的输出生成文件,该程序或实用程序.在其输出中使用了引导。
  • 他们本身不了解规则而这仅仅是一个的例子天上掉馅饼的编程(即做事一种特殊的方式(特别是当它精心设计的)不理解为什么,没有调查,如果有必要,他们正在做这样的说法)。