kma*_*729 20 regex git gitignore
我有以下目录树:
> #pwd is the repo
> tree -a
.
??? .git
? |.....
??? .gitignore
??? README.md
??? f1.html
??? f2.html ... and some more html
??? images
? ??? river.jpg
>
Run Code Online (Sandbox Code Playgroud)
我也有以下内容.gitignore
:
> cat .gitignore
*
!*.html
!images/*.*
>
Run Code Online (Sandbox Code Playgroud)
我希望images目录中的所有文件都包含在repo中.但那并没有发生.我在gitignore中使用以下内容工作:
*
!*.html
!images*
!*.jp*g
Run Code Online (Sandbox Code Playgroud)
这里发生了什么?是否有一种万无一失的测试gitignore的方法.我检查了文档.这是它不理解的一点(这是在模式格式标题下):
否则,Git将模式视为适合fnmatch(3)使用FNM_PATHNAME标志消耗的shell glob:模式中的通配符与路径名中的/不匹配.例如,"Documentation/*.html"匹配"Documentation/git.html",但不匹配"Documentation/ppc/ppc.html"或"tools/perf/Documentation/perf.html".
raj*_*uGT 28
首先,你问题中棘手的部分是.gitignore
文件中的第一行:
* // Says exclude each and every file in the repository,
// unless I specify with ! pattern explicitly to consider it
Run Code Online (Sandbox Code Playgroud)
首先,我们将考虑您的第一个版本.gitignore
.
*
排除存储库中的每个文件.!*.html
允许所有html文件.!images/*.*
考虑图像文件夹中的所有类型的文件.要包含所有JPG/JPEG,您可以简单地添加!*.jp*g
到第3行,这将使git考虑所有jpg和jpeg,而不管该文件所在的任何文件夹.但是你只想从images文件夹而不仅仅是jpg,images文件夹中的任何类型的文件.让我们阅读一些与之相关的文档,在第3部分中我们将讨论解决方案部分.
Git忽略关于文件夹考虑的模式:
模式以斜杠结尾:如果模式结束,<dir-name>/
那么git将忽略该目录和所有其他子目录中包含的文件.作为文档中给出的示例
foo/
将匹配目录foo和它下面的路径,但不匹配常规文件或符号链接foo
但请注意,如果任何模式与排除目录中的文件匹配,git不会考虑它.
模式没有斜杠:如果在忽略列表中指定dir名称并不以斜杠结尾,git会将其视为一个模式,它可以匹配具有该路径名的任何文件.
如果模式不包含斜杠/,Git会将其视为shell glob模式,并检查相对于该位置的路径名是否匹配
带斜杠和特殊字符的模式(*/?):如果模式结束的情况与您给出的第一个示例images/*.*
相同,则按照文档中的说明进行操作
示例:"Documentation/*.html"匹配"Documentation/git.html"但不匹配"Documentation/ppc/ppc.html"或"tools/perf/Documentation/perf.html".
考虑第三点git应该考虑images目录中的所有文件!images/*.*
.但它没有这样做,因为文档说了一个更重要的观点
Git没有列出排除的目录
由于第一行*
,"images"目录本身被忽略.所以首先我们应该告诉git考虑图像目录和后来的其他行明确地考虑其他类型(如果需要).
*
!*.html
!images/ // <- consider images folder
!images/*.*
Run Code Online (Sandbox Code Playgroud)
注意:最后一行仅考虑图像目录中的所有类型的文件,而不考虑其任何子目录.(第2节第3点)