吉特';s.gitignore不能与一个或多个星号限定符+;

吉特';s.gitignore不能与一个或多个星号限定符+;,git,gitignore,Git,Gitignore,我似乎在使用.gitignore中的+(一个或多个)模式匹配器时遇到问题。下面是一个测试,使用+和*作为文件名中嵌入数字的模式限定符。我希望将Test.txt保留在源代码管理中,并忽略Test[0-9]+.txt文件 目录: $ git version git version 2.9.3.windows.1 Git忽略文件内容测试1: $ ll | grep Test -rw-r--r-- 1 asdf 1049089 0 Apr 5 15:55 Test.txt -rw-r--r

我似乎在使用.gitignore中的+(一个或多个)模式匹配器时遇到问题。下面是一个测试,使用
+
*
作为文件名中嵌入数字的模式限定符。我希望将Test.txt保留在源代码管理中,并忽略Test[0-9]+.txt文件

目录:

$ git version
git version 2.9.3.windows.1
Git忽略文件内容测试1:

$ ll | grep Test
-rw-r--r-- 1 asdf 1049089      0 Apr  5 15:55 Test.txt
-rw-r--r-- 1 asdf 1049089      0 Apr  5 15:55 Test123.txt
-rw-r--r-- 1 asdf 1049089      0 Apr  5 15:55 Test1235.txt
-rw-r--r-- 1 asdf 1049089      0 Apr  5 15:55 Test124.txt
测试1:

Test[0-9]+.txt
这应该过滤掉第2到第4个文件

Git忽略文件内容测试2:

$ git status | grep Test
    Test.txt
    Test123.txt
    Test1235.txt
    Test124.txt
测试2:

Test[0-9]*.txt
这应该过滤掉所有的文件


为什么会发生这种情况?

.gitignore
只支持全局模式,不支持正则表达式

这里提到:

否则,
git将模式视为一个shell glob,适合fnmatch(3)
使用
FNM\u路径名
标志:模式中的通配符将与路径名中的
/
不匹配。
例如,“
Documentation/*.html
”匹配“
Documentation/git.html
”但不匹配“
Documentation/ppc/ppc.html
”或“
tools/perf/Documentation/perf.html


有关更多信息,请搜索Glob Patterns与Regex以查看差异。

gitignore文件使用的是globbing,而不是正则表达式。所以使用
+
是无效的

所以你的第二次尝试实际上更接近你想要的

Test*.txt
这将过滤掉以
Test
开头,以
.txt
结尾的文件,中间有任何内容。但它也会捕获
Test.txt
本身,因为glob中的
*
可以是零宽度

你所拥有的可能是最简单的选择

Test[0-9]*.txt
这将匹配
Test
,后跟任何数字,后跟任何内容(包括无内容),后跟
.txt

因此,它是不完美的,因为它也将匹配

$ git status | grep Test
    Test.txt
其数字后面有非数字文本。但你的要求有多具体将决定这一点。您还可以添加一些模式,如

Test1foo.txt
如果你真的要确定它都是数字,那么只需选择多少个数字,然后使用多个这样的条目,使它成为一个非常具体的匹配

Test[0-9].txt
Test[0-9][0-9].txt
Test[0-9][0-9][0-9].txt
Test[0-9][0-9][0-9][0-9].txt
Test[0-9][0-9][0-9][0-9][0-9].txt