解释gitignore模式匹配

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.

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

要包含所有JPG/JPEG,您可以简单地添加!*.jp*g到第3行,这将使git考虑所有jpg和jpeg,而不管该文件所在的任何文件夹.但是你只想从images文件夹而不仅仅是jpg,images文件夹中的任何类型的文件.让我们阅读一些与之相关的文档,在第3部分中我们将讨论解决方案部分.


Git忽略关于文件夹考虑的模式:

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

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

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

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

    如果模式不包含斜杠/,Git会将其视为shell glob模式,并检查相对于该位置的路径名是否匹配

  3. 带斜杠和特殊字符的模式(*/?):如果模式结束的情况与您给出的第一个示例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点)

  • 本来应该是这样的。但它的工作方式是,只需考虑目录,然后具体提及需要考虑其中的哪些文件。如果您只需要考虑该目录中的 png 图像,则第四行可能类似于 `!images/*.png` 并忽略所有其他图像类型。 (2认同)