$ 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
这应该已经过滤掉了所有文件。
为什么会这样?
答案 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
如果你真的必须确定它的所有数字,那么只需选择多少位数,并使用多个这样的条目使它成为非常具体的匹配。