我有以下目录树:
> #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
.
-
*
排除存储库中的每个文件。
-
!*.html
允许所有 html 文件。
-
!images/*.*
考虑图像文件夹中的所有类型的文件。
要包含所有 JPG/JPEG,您只需添加!*.jp*g
在第三行,这将使 git 考虑所有 jpg 和 jpeg,无论该文件所在的任何文件夹。但您特别想要仅来自图像文件夹,而不仅仅是 jpg,图像文件夹中的任何类型的文件。让我们阅读一些与之相关的文档,在第三部分我们将讨论解决方案部分。
Git 忽略有关文件夹注意事项的模式:
-
仅以斜杠结尾的模式:如果模式以<dir-name>/
那么 git 将忽略该目录和所有其他子目录中包含的文件。作为文档中给出的示例
foo/
将匹配目录 foo 及其下面的路径,但不会
匹配常规文件或符号链接 foo
但还要注意,如果任何模式与排除目录中的文件匹配,git 不会考虑它。
-
模式没有斜杠:如果您在忽略列表中指定不以斜杠结尾的目录名称,git 会将其视为只是一个模式,它可以匹配具有该路径名的任何文件。
如果模式不包含斜杠 /,Git 会将其视为壳
全局模式 http://man7.org/linux/man-pages/man7/glob.7.html并检查相对于路径名的匹配
那个地点
-
带有斜杠和特殊字符 (*/?) 的模式:如果模式像您给出的第一个示例一样结束,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(使用前将#替换为@)