Regex 解释如何忽略模式匹配

Regex 解释如何忽略模式匹配,regex,git,gitignore,Regex,Git,Gitignore,我有以下目录树: > #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/*.* >

我有以下目录树:

> #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/*.*
>
我想在图像目录中的所有文件都包括在repo中。但事实并非如此。我在gitignore中使用了以下功能:

*
!*.html
!images*
!*.jp*g
这里发生了什么?是否有一种简单易行的方法来测试gitignore。我检查了房间。这是它不明白的一点(在模式格式标题下):

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


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

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

首先,我们将考虑你的<代码>的第一个版本。p>

  • *
    排除存储库中的每个文件
  • !*。html
    允许所有html文件
  • !图像/ *.*/COD>考虑图像文件夹中的所有类型的文件。
  • 要包含所有JPG/JPEG,只需添加
    !*。JP*G/<代码>第三行,这将使GIT考虑所有JPG和JPEG,而不考虑该文件所在的任何文件夹。但您特别希望只从images文件夹,而不仅仅是jpg,images文件夹中的任何类型的文件。让我们阅读一些与此相关的文档,在第三节中,我们将转到解决方案部分


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

  • 仅以斜杠结尾的模式:如果模式以
    /
    结尾,git将忽略该目录和所有其他子目录中包含的文件。如文件中给出的示例

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

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

  • < > >强>模式没有斜杠< /强>:如果您指定的忽略列表中的DIR名称不以斜线结尾,Git将认为它只是一个模式,可以匹配具有该路径名的任何文件。p> 如果模式不包含斜杠/,Git会将其视为一个斜杠,并检查是否与相对于的路径名匹配 地点

  • 带斜杠和特殊字符(*/?)的模式:如果模式的结尾与您给出的第一个示例相同,
    images/*.*
    它可以按照文档中的指定工作

    示例:“Documentation/*.html”匹配“Documentation/git.html”,但不匹配 “Documentation/ppc/ppc.html”或“tools/perf/Documentation/perf.html”


  • 解决方案

    考虑第三点Git应考虑图像目录中的所有文件<代码>!图像/*.

    模式。但它并没有这样做,因为文件中说了一个更重要的点

    Git没有列出排除的目录

    由于第一行
    *
    “images”目录本身被忽略。所以首先我们应该告诉GIT考虑图像目录和后来的附加行,明确地考虑其他类型(如果需要的话)。
    *
    !*.html
    
    !images///第三行不是意味着第四行吗
    images/
    的意思是“忽略images目录和其中的所有内容,所以我希望
    !images/
    的意思是“不要忽略images目录和其中的所有内容?应该是这样的。”。但是它的工作方式是,只考虑目录,并且具体地提到需要考虑哪些文件。如果你只需要考虑那个目录中的PNG图像,第四行可以像<代码>!images/*.png
    并忽略所有其他图像类型。
    *
    !*.html
    !images/                 // <- consider images folder
    !images/*.*