Git的.gitignore不适用于一个或多个星号限定符+

时间:2017-04-05 20:06:41

标签: git gitignore

$ git version
git version 2.9.3.windows.1

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

目录:

$ 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

Git忽略文件内容测试1:

Test[0-9]+.txt

测试1:

$ git status | grep Test
    Test.txt
    Test123.txt
    Test1235.txt
    Test124.txt

这应该过滤掉第2到第4个文件。

Git忽略文件内容测试2:

Test[0-9]*.txt

测试2:

$ git status | grep Test
    Test.txt

这应该已经过滤掉了所有文件。

为什么会这样?

2 个答案:

答案 0 :(得分:2)

.gitignore仅支持Glob模式,而不支持正则表达式。

这是gitignore man page提及的内容:

  

否则,带有git treats the pattern as a shell glob suitable for consumption by fnmatch(3)标记的FNM_PATHNAME:模式中的通配符与路径名中的/不匹配。
  例如,“Documentation/*.html”匹配“Documentation/git.html”,但不匹配“Documentation/ppc/ppc.html”或“tools/perf/Documentation/perf.html”。

有关详细信息,请搜索Glob Patterns vs Regex以查看差异。

答案 1 :(得分:1)

.gitignore文件正在使用globbing, not 正则表达式。因此,使用+无效。

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

Test*.txt

这会过滤掉以Test开头并以.txt结尾的文件,其中包含介于两者之间的任何内容。但它也会捕获Test.txt本身,因为glob中的*可以是零宽度。

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

Test[0-9]*.txt

这将匹配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

如果你真的必须确定它的所有数字,那么只需选择多少位数,并使用多个这样的条目使它成为非常具体的匹配。