.gitignore 样式 fnmatch()

Posted

技术标签:

【中文标题】.gitignore 样式 fnmatch()【英文标题】:.gitignore style fnmatch() 【发布时间】:2012-04-20 09:03:30 【问题描述】:

在 Python 中使用 .gitignore 样式的 fnmatch() 最简单的方法是什么。看起来 stdlib 没有提供 match() 函数,该函数将路径规范与 UNIX 样式路径正则表达式匹配。

fnmatch() 只匹配纯文件名,不匹配路径http://docs.python.org/library/fnmatch.html?highlight=fnmatch#fnmatch

glob()会进行目录列表,不提供match()真假风格函数http://docs.python.org/py3k/library/glob.html?highlight=glob#glob.glob

.gitignore 的路径和带有通配符的文件都被列入(黑)名单

https://github.com/miohtama/Krusovice/blob/master/.gitignore

http://linux.die.net/man/5/gitignore

【问题讨论】:

为什么正则表达式对你不起作用? 我更愿意只接受有效的答案。 也许我问的问题太难了? :) 我猜你可以这样看,或者只是有不切实际的期望。你的一些问题得到了很好的活动,有些则没有。而且你也有一些被否决或关闭的;真是鱼龙混杂。当人们知道您是可以得到帮助的人时,它确实会激发人们在这个社区中与您的问题进行互动。如果没有什么能让你满意,那么尝试提供答案有什么意义? 我不是在寻找娱乐或因果报应,我在寻找答案。正确的答案将被接受,我希望人们在尝试之前就能做到这一点,这样我就不需要无耻地否决错误/不正确的答案。好的答案 = 好的业力 :) 【参考方案1】:

有一个名为pathspec 的库,它实现了完整的.gitignore 规范,包括**/*.py 之类的东西; documentation 描述了如何处理 Git 模式匹配(您也可以查看 code)。

>>> import pathspec
>>> spec_src = '**/*.pyc'
>>> spec = pathspec.PathSpec.from_lines(pathspec.patterns.GitWildMatchPattern, spec_src.splitlines())
>>> set(spec.match_files("test.py", "test.pyc", "deeper/file.pyc", "even/deeper/file.pyc"))
set(['test.pyc', 'even/deeper/file.pyc', 'deeper/file.pyc'])
>>> set(spec.match_tree("pathspec/"))
set(['__init__.pyc', 'gitignore.pyc', 'util.pyc', 'pattern.pyc', 'tests/__init__.pyc', 'tests/test_gitignore.pyc', 'compat.pyc', 'pathspec.pyc'])

【讨论】:

【参考方案2】:

如果您想使用 .gitignore 示例中列出的混合 UNIX 通配符模式,为什么不采用每个模式并将 fnmatch.translatere.search 一起使用?

import fnmatch
import re

s = '/path/eggs/foo/bar'
pattern = "eggs/*"

re.search(fnmatch.translate(pattern), s)
# <_sre.SRE_Match object at 0x10049e988>

translate 将通配符模式转换为 re 模式

隐藏的 UNIX 文件:

s = '/path/to/hidden/.file'
isHiddenFile = re.search(fnmatch.translate('.*'), s)
if not isHiddenFile:
    # do something with it

【讨论】:

不幸的是,这种简单的 fnmatch 模式失败了,比如 .*(忽略所有 UNIX 隐藏文件)。 @MikkoOhtamaa:我不确定我是否跟随。我的更新显示它正确匹配隐藏的 unix 文件的路径。 @MikkoOhtamaa:是的,我放弃了。我不明白相关性。祝你好运! 但是你走在了非常正确的轨道上 - 错误更像是 Python fnmatch() 本身的更深层次的问题。我会将其标记为已关闭,并将此链接留给后代github.com/miohtama/vvv/tree/master/vvv/bzrlib 作为解决方案。

以上是关于.gitignore 样式 fnmatch()的主要内容,如果未能解决你的问题,请参考以下文章

Python——模块——fnmatch(文件名对比)

.gitignore文件无效解决

Git 忽略 Windows 10 下的 gitignore 文件

Git - 供应商文件夹修改 - .gitignore?

Git忽略规则(.gitignore配置)不生效原因和解决

您可以在单个存储库中为每个目录添加额外的 .gitignore 吗?