git - 澄清 gitignore 文档
问题描述
我不明白gitignore
文档中的一些陈述:https ://git-scm.com/docs/gitignore
我不明白的部分以粗体显示。我的问题是斜体的。
如果模式以斜线结尾,则出于以下描述的目的将其删除“
什么被删除?什么是“以下描述”?
如果模式不包含斜杠 /,Git 将其视为 shell glob 模式并检查与 .gitignore 文件位置相关的路径名是否匹配 [..]否则,Git 会将模式视为 shell glob
“否则”来自什么?他们是否在模式中对比“有”和“没有”斜线?如果是这样,这两种情况如何区别对待?
尾随的“/**”匹配里面的所有内容。
/
这与没有星号的尾随结果相同吗?从我在关于尾部斜杠的要点中可以看到它看起来像它(“foo / 将匹配目录 foo 和它下面的路径”)。
您是否也觉得此文档令人困惑?如果是这样,向 Git 团队发出信号的最佳方式是什么?(邮件列表或问题跟踪器?)。
解决方案
我还发现旧的描述非常混乱。我创建了一个 PR 来改进规则。我觉得现在好多了。
这里是新文档的摘录。
斜杠 / 用作目录分隔符。分隔符可能出现在 .gitignore 搜索模式的开头、中间或结尾。
如果模式的开头或中间(或两者)有分隔符,则该模式是相对于特定 .gitignore 文件本身的目录级别的。否则,模式也可能在 .gitignore 级别以下的任何级别匹配。
如果模式末尾有分隔符,则该模式将仅匹配目录,否则该模式可以匹配文件和目录。
例如,模式 doc/frotz/ 匹配 doc/frotz 目录,但不匹配 /doc/frotz 目录;但是 frotz/ 匹配 frotz 和 a/frotz 是一个目录(所有路径都是 .gitignore 文件的相对路径)。
不过,这里是您问题的答案:
如果模式以斜线结尾,则出于以下描述的目的将其删除“
什么被删除?什么是“以下描述”?
这意味着在提到斜杠时会排除尾部斜杠。但它实际上只影响下一段。
如果模式不包含斜杠 /,Git 将其视为 shell glob 模式并检查与 .gitignore 文件位置相关的路径名是否匹配 [..]否则,Git 会将模式视为 shell glob
“否则”来自什么?他们是否在模式中对比“有”和“没有”斜线?如果是这样,这两种情况如何区别对待?
因此,考虑到上述解释,第一段的意思是:
如果模式不包含斜线“/”,除了尾部斜线,则该模式将在所有目录中匹配。
换句话说,foo/
将匹配/bar/foo/
和foo
将匹配/bar/foo
而“其他部分”是指:
如果模式包含斜杠“/”而不是尾部斜杠,则始终从根开始考虑。
换句话说,foo/bar
将匹配/foo/bar
但不匹配/bar/foo/bar
。
尾随的“/**”匹配里面的所有内容。
/
这与没有星号的尾随结果相同吗?从我在关于尾部斜杠的要点中可以看到它看起来像它(“foo / 将匹配目录 foo 和它下面的路径”)。
有细微的差别。foo/
将忽略文件夹,而foo/**
将忽略文件夹及其内容。
因此,如果这是您的文件结构:
.gitignore
foo
├── bar.json
└── foo.txt
那么以下 .gitignore 文件将跟踪所有内容:
foo/
!foo/
然而
foo/**
!foo/
什么都不会追踪。因为您首先忽略所有文件,然后您取消忽略该文件夹/foo
,但由于该文件夹没有可跟踪的文件,它是空的,空文件夹不被 git 跟踪。
推荐阅读
- azure - 将 spark 数据框存储到 csv 文件中,然后压缩该文件并将其存储在 datalake 中
- javascript - 需要帮助解码跨站点脚本 javascript 攻击
- python - 美丽的汤返回无
- node.js - /usr/bin/npm: 没有这样的文件或目录
- asp.net-core - 在 swagger ui 中使用 asp.net core 3.1 中的 Swashbuckle 6.0.5 使 AuthorizationUrl 可配置
- fish - 将文件行读入列表
- node.js - Node.js - 在 fs 函数中赋值后未定义的变量
- python - 如何总结python中的单个嵌套列表
- mongodb - 索引未使用嵌套字段层次结构选取,但在展平模式下选取
- sql - 将 SQR 转换为 SQL 以在 SQL Developer 中运行