当我编译我的 C++ 项目时,会创建许多共享对象文件,并带有扩展名,例如
.so
.so.0
.so.7
.so.0.7
我需要将所有这些添加到我的.gitignore
文件中。如果这是一个正则表达式,我可以使用
\.so[\.0-9]*
但是,文档说.gitignore
将模式视为适合
fnmatch(3)
与FNM_PATHNAME
标志一起使用的 shell glob
fnmatch
我发现没有办法用我找到的文档做我想做的事。真的没有办法做到这一点吗?
虽然@SpeakEasy 的答案可以.so
在一个步骤中使用 忽略文件*.so*
,但对于您忽略指定格式文件的用例,您可以在.gitignore
更具体的忽略规则中使用两个条目
*.so
*.so.[0-9]*
gitignore 文件中的每一行都指定一个模式。
Git 将模式视为一个 shell glob,适合由
fnmatch
需要注意的重要一点是,模式与正则表达式不同。
Python 有一个名为fnmatch的模块,您可以使用它来验证特定文件名是否与模式匹配。
示例:
import fnmatch
pattern = "*.so.[0-9]*"
filenames = ["a.so", "b.so.0", "b.so.11", "b.so.1.0", "b.so.1.0.12"]
for filename in filenames:
print filename, fnmatch.fnmatch(filename, pattern)
>>> a.so False
b.so.0 True
b.so.11 True
b.so.1.0 True
b.so.1.0.12 True
添加行*.so*
不行吗?还是您需要更精细的控制?
我认为您可以通过两行来完成它:
.so
.so.[0-9]*
Python 有一个名为 fnmatch 的模块,您可以使用它来验证特定文件名是否与模式匹配。
不像@mu无所说的那样完全正确。
https://git-scm.com/docs/gitignore
例如,“/*.c”匹配“cat-file.c”但不匹配“mozilla-sha1/sha1.c”。
但我在 fnmatch 中尝试过:
>>> p = "/*.c"
>>> f = "cat-file.c"
>>> fnmatch(f, p)
False
>>> f2 = "abc/def/cat-file.c"
>>> fnmatch(f2, p)
False
>>> p2 = "*.c"
>>> fnmatch(f, p2)
True
>>> fnmatch(f2, p2)
True
fnmatch 不匹配cat-file.c
但 .gitignore 支持。