9

当我编译我的 C++ 项目时,会创建许多共享对象文件,并带有扩展名,例如

.so
.so.0
.so.7
.so.0.7

我需要将所有这些添加到我的.gitignore文件中。如果这是一个正则表达式,我可以使用

\.so[\.0-9]*

但是,文档.gitignore

将模式视为适合fnmatch(3)FNM_PATHNAME标志一起使用的 shell glob

fnmatch我发现没有办法用我找到的文档做我想做的事。真的没有办法做到这一点吗?

4

5 回答 5

13

虽然@SpeakEasy 的答案可以.so在一个步骤中使用 忽略文件*.so*,但对于您忽略指定格式文件的用例,您可以在.gitignore更具体的忽略规则中使用两个条目

*.so
*.so.[0-9]*

gitignore 手册页

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
于 2014-07-03T10:46:43.990 回答
5

添加行*.so*不行吗?还是您需要更精细的控制?

于 2013-10-15T21:33:01.090 回答
1

我认为您可以通过两行来完成它:

.so
.so.[0-9]*
于 2014-07-01T16:20:10.733 回答
0

来自torek 的评论

使用多行:

*.so
*.so.[0-9]
*.so.[0-9].[0-9]

等等

不知道有没有更好的办法...

于 2014-07-01T16:10:54.930 回答
0

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 支持。

于 2018-05-10T09:16:52.853 回答