类似正则表达式的shell glob模式用于gitignore

9
当我编译我的C++项目时,会创建许多带有扩展名的共享对象文件,例如:
.so
.so.0
.so.7
.so.0.7

我需要把这些内容添加到我的.gitignore文件中。如果这是一个正则表达式的话,我可以使用:
\.so[\.0-9]*

然而,文档指出,.gitignore将该模式视为适合由fnmatch(3)使用的shell glob,并带有FNM_PATHNAME标志。我没有找到任何方法来实现我想要的fnmatch文档说明,真的没有办法吗?

3
使用多行:*.so *.so.[0-9] *.so.[0-9].[0-9] 等等。如果版本号可能超过两位数,则需要更多的 glob 模式。(hg 在其 .hgignore 中有 syntax: 指令,因此您可以根据需要混合使用正则表达式和 glob;也许将来会有人将类似的功能添加到 git 中。) - torek
1
只需保持独立的安装层次结构,就可以完全解决这种问题。 - jthill
感兴趣的内容:https://github.com/git/git/commit/2e22a85e5c01d041434682fe75f58be94de0801b - VonC
5个回答

13

虽然@SpeakEasy的答案可以使用*.so*单步忽略.so文件,但对于您需要忽略特定格式的文件的情况,您可以在.gitignore中使用两个条目来实现更具体的忽略规则。

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

来自 gitignore 手册

gitignore 文件中的每一行都指定了一个模式。

Git 将该模式视为适合由fnmatch使用的 shell glob。

需要注意的重要事项是,模式与正则表达式不同。

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

是的,我不是专家,所以我不知道应该信任谁,但我觉得@torek的答案更安全和清晰。如果我错了,请告诉我。 - arthur.sw
1
@mu無:所有与 *.so.[0-9]*.[0-9]* 匹配的内容也会与 *.so.[0-9]* 匹配,对吗?如何编写 *.so.someDigits.someDigits,其中 someDigits 只是 任意数量的数字 - arthur.sw
1
@mu無,我认为你的模式可以匹配“my.pattern.is.so.6ood”。我同意这不是什么大问题。 - arthur.sw
@mu無 如果你修改了你的答案,我会给你悬赏:*.so.[0-9]*.[0-9]**.so.[0-9]*.[0-9]*.[0-9]*是无用的,因为已经在.so.[0-9]*中考虑到了这一点。这意味着你应该改变你的编辑。如果解决方案首先出现,只有这两行*.so*.so.[0-9]*会更好。 - arthur.sw
虽然这并不是一个真正的答案,但显然没有其他答案可供选择,所以我只能选择你的答案了。 - roim
显示剩余3条评论

5
添加 *.so* 这一行行不行?还是你需要更精细的控制?

2
我想更好地控制以确保安全。我总是“发现”新的扩展。 - roim

1

我认为你可以用两行代码完成它:

.so
.so.[0-9]*

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


0

来自Torek的评论

Use multiple lines:

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

etc.

我不知道是否有更好的方法...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接