git - .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 -A
和git status
,则仅跟踪这些文件:
new file: .gitignore
new file: foo/foo0.txt
那么,这样做的目的是./
什么?
编辑:我在 Windows 上。
解决方案
请记住,在 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 编程的一个例子(即以特定的方式做事(特别是当它很复杂时)而不理解他们为什么这样做,并且没有调查是否有必要)。
推荐阅读
- node.js - 如何在nodejs中集成payoneer
- c# - 我的统一预制件在一个接一个生成时没有运行脚本(使用 XR 控制器)
- c# - Microsoft Json 规则引擎自定义错误消息
- ios - Swift Detect UISlider 图像点击
- react-native - 在 React Native 中压缩图像/视频
- linux - GIT push 命令什么都不做 - 命令在 1 秒内完成
- c# - 实现这一点的最佳方法?
- angularjs - 角度材料表合并表中第一行的列
- amazon-web-services - 脚本从 Auto Scaling 组中获取实例,然后获取该实例的主机名
- android - 如何在 Kotlin Flow 中添加动态值