解释 gitignore 模式匹配

2024-03-05

我有以下目录树:

> #pwd is the repo   
> tree -a
.
├── .git
│   |.....
├── .gitignore
├── README.md
├── f1.html
├── f2.html ... and some more html
├── images
│   └── river.jpg
>

我的中也有以下内容.gitignore:

> cat .gitignore
*
!*.html
!images/*.*
>

我希望图像目录中的所有文件都包含在存储库中。但这并没有发生。我在 gitignore 中使用以下命令让它工作:

*
!*.html
!images*
!*.jp*g

这里发生了什么?有没有一种万无一失的方法来测试 gitignore.我检查了文档 https://git-scm.com/docs/gitignore。这是它不明白的一点(这是在图案格式标题):

否则,Git 将该模式视为适合的 shell glob fnmatch(3) 与 FNM_PATHNAME 标志的消耗:通配符 模式将与路径名中的 / 不匹配。例如, “Documentation/*.html”与“Documentation/git.html”匹配,但不匹配 “文档/ppc/ppc.html”或“工具/perf/文档/perf.html”。


首先,你的问题中棘手的部分是第一行.gitignore file:

*  // Says exclude each and every file in the repository,
   // unless I specify with ! pattern explicitly to consider it

首先我们将考虑您的第一个版本.gitignore.

  1. *排除存储库中的每个文件。
  2. !*.html允许所有 html 文件。
  3. !images/*.*考虑图像文件夹中的所有类型的文件。

要包含所有 JPG/JPEG,您只需添加!*.jp*g在第三行,这将使 git 考虑所有 jpg 和 jpeg,无论该文件所在的任何文件夹。但您特别想要仅来自图像文件夹,而不仅仅是 jpg,图像文件夹中的任何类型的文件。让我们阅读一些与之相关的文档,在第三部分我们将讨论解决方案部分。


Git 忽略有关文件夹注意事项的模式:

  1. 仅以斜杠结尾的模式:如果模式以<dir-name>/那么 git 将忽略该目录和所有其他子目录中包含的文件。作为文档中给出的示例

    foo/将匹配目录 foo 及其下面的路径,但不会 匹配常规文件或符号链接 foo

    但还要注意,如果任何模式与排除目录中的文件匹配,git 不会考虑它。

  2. 模式没有斜杠:如果您在忽略列表中指定不以斜杠结尾的目录名称,git 会将其视为只是一个模式,它可以匹配具有该路径名的任何文件。

    如果模式不包含斜杠 /,Git 会将其视为壳 全局模式 http://man7.org/linux/man-pages/man7/glob.7.html并检查相对于路径名的匹配 那个地点

  3. 带有斜杠和特殊字符 (*/?) 的模式:如果模式像您给出的第一个示例一样结束,images/*.*它按照文档中指定的方式工作

    示例:“Documentation/*.html”与“Documentation/git.html”匹配,但不匹配 “文档/ppc/ppc.html”或“工具/perf/文档/perf.html”。


Solution

考虑到第三点 git 应该考虑图像目录中的所有文件!images/*.*图案。但它并没有这样做,因为文档说了更重要的一点

Git 不列出排除的目录

因为第一行*“images”目录本身被忽略。因此,首先我们应该告诉 git 考虑图像目录,然后明确地告诉 git 考虑其他类型(如果需要)。

*
!*.html
!images/                 // <- consider images folder
!images/*.*

Note:最后一行仅考虑图像目录中的所有类型的文件,而不考虑其任何子目录中的文件。 (第2节第3点)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

解释 gitignore 模式匹配 的相关文章

随机推荐