regex - 解释 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/*.*
>

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

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

这里发生了什么?有没有万无一失的方法来测试 gitignore。我检查了 documentation .这是它不理解的地方(在模式格式标题下):

Otherwise, Git treats the pattern as a shell glob suitable for consumption by fnmatch(3) with the FNM_PATHNAME flag: wildcards in the pattern will not match a / in the pathname. For example, "Documentation/*.html" matches "Documentation/git.html" but not "Documentation/ppc/ppc.html" or "tools/perf/Documentation/perf.html".

最佳答案

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

*  // 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在第 3 行,这将使 git 考虑所有 jpg 和 jpeg,而不管该文件所在的任何文件夹。但是您特别想要图像文件夹中的任何类型的文件,而不仅仅是 jpg,图像文件夹中的任何类型的文件。让我们阅读一些相关的文档,在第 3 部分我们将转到解决方案部分。


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

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

    foo/ will match a directory foo and paths underneath it, but will not match a regular file or a symbolic link foo

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

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

    If the pattern does not contain a slash /, Git treats it as a shell glob pattern and checks for a match against the pathname relative to the location

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

    Example: "Documentation/*.html" matches "Documentation/git.html" but not "Documentation/ppc/ppc.html" or "tools/perf/Documentation/perf.html".


解决方案

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

Git doesn’t list excluded directories

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

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

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

关于regex - 解释 gitignore 模式匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33189437/

相关文章:

javascript - Unicode 正则表达式\p{L} 在 NodeJS 中不起作用

git: pull 特定分支,只保留最新的树(没有任何历史记录)

git - 什么是签名提交?

git - 我无法将目录添加到 .gitignore

gitignore 不工作-想忽略除 gitignore 文件以外的所有内容以保留 'empty' 目录

正则表达式:匹配除特定模式之外的所有内容

正则表达式匹配以特定字符串开头的所有行

java - Java中如何使用正则表达式解析HTML?

git - p4 命令行相当于 “git log -p” ?

git - .gitignore 用于 Mono/MonoDevelop 项目