Lore 中的 glob-match:线性时间通配符匹配库及其 `**` 回溯缺陷修复
版本控制后端【免费下载链接】loreLore is a next-generation, open source version control system项目地址https://gitcode.com/gh_mirrors/lore6/lore点击查看免费下载本篇介绍 Lore 仓库通过vendor目录本地化vendoring引入的glob-match通配符匹配库它的语法、两个核心 API 的用法以及 Lore 团队在0.2.1版本中发现并修复的**globstar回溯缺陷。读完后你将理解 gitignore 风格过滤为何依赖正确的**语义以及 Lore 如何用一条低开销的“确认回退路径”在不改动上游状态机的前提下补齐了遗漏的匹配。glob-match 是什么glob-match 是一个高性能的 glob 通配符匹配库支持通配符、字符类和大括号展开。它的设计目标是把匹配开销压到最低核心特性包括线性时间匹配不存在指数级回溯零分配匹配过程不产生堆分配无正则编译匹配直接在 glob 模式串的原位进行matching occurs on the glob pattern in place支持捕获通配符匹配到的区间可把模式中的动态部分从路径字符串中切出来数以千计的测试用例基于 Bash 与 micromatch 的行为。在 Lore 中它被 vendored 到 vendor/glob-match并通过工作区根 Cargo.toml 的[patch.crates-io]段把 crates.io 上的glob-match 0.2.1重定向到本地目录。根 Cargo.toml 的注释直接点明动机Fixes a**backtracking defect that made the filter silently under-exclude; see vendor/glob-match/Cargo.toml.也就是说Lore 的过滤逻辑gitignore 文档、view filter会原样接受**这类 gitignore 语法上游库的一个**缺陷会让 Lore 静默漏排除路径因此必须本地化并修正。语法Lore 过滤器实际接受的通配符语义README 中的语法表完整继承了 Bash/micromatch 的常见约定这也是 Lore 过滤层向用户暴露的语义语法含义?匹配任意单个字符*匹配零个或多个字符但不跨路径分隔符如/**匹配零个或多个字符包括路径分隔符必须作为一个完整的路径段出现后面跟/或模式结束[ab]匹配方括号内的任一字符支持范围如[a-z]用[!ab]或[^ab]表示取反{a,b}匹配大括号内的某个子模式子模式可使用任意通配符大括号最多嵌套 10 层!位于模式开头时取反整个匹配结果多个!会多次取反\反斜杠可转义上述任一特殊字符其中**的“必须构成完整路径段”一条在实现里有明确体现src/lib.rs 中只有当**前面是模式起点或/、且后面紧跟/或模式结束时才被当作真正的 globstar 处理这使得a/**/b能匹配a/b中间段整体可选却不会让a**b这类写法获得 globstar 语义。两个核心 API基础匹配glob_match最直接的用法是一个布尔判断use glob_match::glob_match; assert!(glob_match(some/**/{a,b,c}/**/needle.txt, some/path/a/to/the/needle.txt));Lore 的过滤层正是这样调用它的。在 lore-revision/src/filter.rs 的step方法中过滤规则逐行推进每一行非字面量规则都会调用glob_match::glob_match(line.glob.as_str(), to_match)判定命中命中后该行的negated标志决定路径最终是被排除还是被重新纳入。测试 lore-revision/tests/filter_gitignore.rs 还展示了 gitignore 语义的一个常用变体glob_match(glob, file) || glob_match(format!({glob}/**), file)即用“原模式”或“原模式加/**”的或运算来覆盖 gitignore 中目录模式的两种解释。捕获匹配glob_match_with_captures第二个 API 返回模式中动态部分在路径串里对应的区间方便把通配符实际匹配到的内容切出来use glob_match::glob_match_with_captures; let glob some/**/{a,b,c}/**/needle.txt; let path some/path/a/to/the/needle.txt; let result glob_match_with_captures(glob, path) .map(|v| v.into_iter().map(|capture| path[capture]).collect()); assert_eq!(result, vec![path, a, to/the]);captures是VecRangeusize每个区间对应一个通配部分在路径串中的起止位置对区间切片即可得到path、a、to/the这三段被**/{a,b,c}吸收的内容。匹配不上时返回None。从 src/lib.rs 可以看到捕获版本只是给同一个glob_match_internal传入了一个 captures 缓冲区区间状态保存在State结构体的capture_index字段中随*/**的回溯同步回滚。实现要点单遍状态机 回退栈glob_match_internalsrc/lib.rs是一个双指针状态机注释注明算法源自 research.swtch.com/glob 的经典线性 glob 算法State保存path_index/glob_index两个指针、捕获索引以及wildcard和globstar两个回退点回退点刻意用u32而非usize存储源码注释说明这能带来约 10% 的性能收益src/lib.rs大括号展开用一个固定 10 深度的BraceStack保存每个分支的进入状态支持最多 10 层嵌套遇到*时记录回退点遇到**时合并连续的**段并单独维护 globstar 回退点字面字符失配时先尝试state.backtrack()回到最近的*重试再尝试切换大括号分支。README 给出的基准数据量级为glob_match单次匹配约 180 ns对比glob的 ~340 ns 与globset的 ~35 µs这也解释了为什么 Lore 把这样一个热路径上逐行、逐路径调用的匹配器做成分布式过滤遍历需要对每个候选路径逐条规则求值。Lore 的修正**回溯缺陷与 doublestar 确认路径缺陷长什么样上游 0.2.1 的缺陷在 vendored 版本里被明确注释记录。当模式形如**/含通配符的段时快速路径会在第一个字面量字符匹配成功、把 globstar 回退点“提交”state.globstar.path_index 0之后再无法恢复于是**已经“走过”的路径段永远不会被重新吸收。后果是**/*b不匹配b/b但匹配x/b**/*/a不匹配d/a。匹配结果取决于**吸收段的名字这本身就是错误的信号——同一个模式、同构的路径只是段名不同判定却不一样。提交该缺陷位置在 src/lib.rs 的注释写得很直白“this commit is irreversible, and that is the**backtracking defect”。修复策略保留上游状态机只补一条确认路径Lore 的选择是不改上游状态机的任何一步而是在公共入口 glob_match 外面加一层判定pub fn glob_match(glob: str, path: str) - bool { if glob_match_internal(glob, path, None) { return true; } if doublestar::may_be_missed(glob.as_bytes()) doublestar::is_plain_path(path.as_bytes()) { return doublestar::matches(glob.as_bytes(), path.as_bytes()); } false }三个设计点值得注意快速路径的否定结论才是可信需要复核的部分glob_match_internal可能漏判miss a match但从不会误报一个不存在的匹配所以只有当它返回false且模式确实可能触发缺陷时才付出第二遍的代价。may_be_missed做廉价前置筛选src/lib.rs先用字节扫描确认模式里根本没有**就直接返回false绝大多数 glob 不含**再排除花括号展开、前导!和转义——这些是确认匹配器未实现的构造而 Lore 的过滤器不会产生它们gitignore 语法本身也没有花括号语法。命中缺陷形状**之后还跟着含通配符的段才放行。doublestar::matches是分组件的动规划分器src/lib.rs把模式与路径都按/切成组件列表用一条reachable布尔行做原地更新的可达性传播。**可以吸收任意多个组件但每个(模式组件, 路径组件)组合只决策一次因此是多项式时间而非朴素递归的指数时间。组件级的component匹配则退化为经典的双指针带*回退的线性匹配并复用与快速路径一致的字符类规则含[!...]/[^...]取反与a-z范围。边界对齐确认匹配器刻意与快速路径保持同一组边角行为——尾部的**要求至少剩余一个组件对应 gitignore “trailing/**匹配其内部一切”的语义其余位置的**可以吸收零个组件所以a/**/b匹配a/b含空组件的路径前导、尾随或双分隔符则直接拒绝让快速路径的结论维持原判因为仓库内相对路径本就是规整过的。vendor/glob-match/Cargo.toml 的头部注释把整件事概括为一句话并提醒“Upstream this”这是从 crates.io 0.2.1MIT, Devon Govett拉下来、只为修**回溯缺陷的 vendored 副本bench 及其 dev-dependencies 被移除只保留库本身。回归测试判定不能取决于**吸收了什么名字tests/doublestar.rs 是随修复加入的测试其核心思想是“无参照实现的判定法”每个用例都是同一模式对两条无法区分的路径——模式的分解完全相同只有**吸收段的拼写不同。若匹配器对两者给出不同答案必有一错因此不需要外部参照实现即可断言。测试覆盖了三个方向修复生效**/*b对x/b与b/b都为truea/**/*.tmp对a/q/y.tmp与a/x.tmp/y.tmp都为true上游对每对中的第一个返回false没有放宽模式上游原本就判false的用例保持false例如**/*b对b/a、a/**/b对a/bb**是整段不能吞掉bb的一部分、a/**对a尾部**需要自己的段不受影响的形状**后面全是字面量如**/foo从未到达缺陷点仅由快速路径作答。小结glob-match在 Lore 中的角色是“热路径上的过滤判定器”它把 gitignore/view 过滤文档中逐字接受的通配符语法?、*、**、[ab]、{a,b}、!、\落到每次路径遍历的每一步上性能以纳秒计。Lore 对其做的本地化修正展示了开源项目中一种务实的依赖治理方式不动上游算法只在边界处加一条仅对已知缺陷形状生效的多项式确认路径并以“同构路径判定一致性”为锚点编写自洽的回归测试从而在不引入二次维护成本的前提下让过滤器的排除语义严格对齐 gitignore 文档承诺的行为。赞分享版本控制后端【免费下载链接】loreLore is a next-generation, open source version control system项目地址https://gitcode.com/gh_mirrors/lore6/lore点击查看免费下载相关推荐micromatch高性能的通配符与 glob 匹配库micromatch高性能的通配符与 glob 匹配库 micromatch 是一个专为 JavaScript/Node.js 设计的高度优化的通配符和 gl开发工具kubesphere 项目中的 Go 通配符匹配库 gobwas/glob 深入解析kubesphere 项目中的 Go 通配符匹配库 gobwas/glob 深入解析 导读 github.com/gobwas/glob 是一个专为 Go 语云原生容器编排后端微服务多集群DevOps可观测性AI 技能tiny-glob: 极速简易的通配符匹配工具tiny glob: 极速简易的通配符匹配工具 项目介绍 tiny glob 是一个轻量级且响应迅速的 globbing 解决方案专为 Node.js 设计。上一篇Data Engineer Handbook数据工程GitLab CI使用指南下一篇把PS3跑起来RPCS3模拟器10分钟上手手册创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

OpenPencil 完全指南:开源 .fig/.pen 设计编辑器的可编程 CLI、AI 与 MCP 实战

OpenPencil 完全指南:开源 .fig/.pen 设计编辑器的可编程 CLI、AI 与 MCP 实战

前端桌面应用AI 应用MCP 服务 【免费下载链接】open-pencil AI-native design editor. Open-source Figma alternative. 项目地址: https://gitcode.com/gh_mirrors/op/open-pencil 点击查看 免费下载 OpenPencil 是一个开源的 AI-native 设计编辑器,原…

2026/9/25 3:00:31 阅读更多 →
Containerization x86_64 部署构建指南:基于 aarch64 开发容器交叉产出 Linux 部署包

Containerization x86_64 部署构建指南:基于 aarch64 开发容器交叉产出 Linux 部署包

容器运行时虚拟化云原生 【免费下载链接】containerization Containerization is a Swift package for running Linux containers on macOS. 项目地址: https://gitcode.com/gh_mirrors/cont/containerization 点击查看 免费下载 本指南围绕 make dist-x86_64 展开…

2026/9/25 3:00:31 阅读更多 →
BAML jsonish 柔性解析器:把 LLM 自由文本可靠地解析成结构化数据

BAML jsonish 柔性解析器:把 LLM 自由文本可靠地解析成结构化数据

编程语言AI Agent编译器CLI人工智能 【免费下载链接】baml The programming language for agents 项目地址: https://gitcode.com/gh_mirrors/ba/baml 点击查看 免费下载 本文聚焦 BAML 引擎中的 jsonish 库(位于 engine/baml-lib/jsonish)&…

2026/9/25 3:00:31 阅读更多 →

最新新闻

大鱼营销解析行业内知名谷歌SEO服务商如何选择

大鱼营销解析行业内知名谷歌SEO服务商如何选择

引言:出海浪潮下,谷歌SEO服务商选择成关键命题在全球化数字营销浪潮中,谷歌SEO已成为中国企业开拓海外市场、实现品牌破圈的核心抓手。然而,面对市场上良莠不齐的服务商,如何筛选出真正具备技术实力与实战经验的合作伙…

2026/9/25 3:46:59 阅读更多 →
从“我就位了”到系统就绪:初始化与状态管理原理剖析

从“我就位了”到系统就绪:初始化与状态管理原理剖析

您好,我已经就位。请按照以下格式提供您的项目信息,我将基于这些内容生成一篇独立、完整的深度博文:项目标题: [标题] 项目正文: [通常比较零散、不完整的原始描述,可以是任意领域内容] 关键词: [关键词1, 关键词2, ...] 摘要描述…

2026/9/25 3:46:59 阅读更多 →
大鱼营销分享行业内热门谷歌SEO公司推荐哪家更靠谱

大鱼营销分享行业内热门谷歌SEO公司推荐哪家更靠谱

在全球化数字营销浪潮下,谷歌SEO已成为中国企业出海获客的核心渠道。面对市场上众多的谷歌SEO服务商,如何选择一家真正靠谱、能带来实际效果的合作伙伴,成为许多外贸企业关注的焦点。本文基于行业经验,从技术实力、服务模式、效果…

2026/9/25 3:46:59 阅读更多 →
大鱼营销分享:谷歌SEO服务商挑选要点与靠谱判断

大鱼营销分享:谷歌SEO服务商挑选要点与靠谱判断

在全球化数字营销浪潮中,谷歌SEO已成为中国企业开拓海外市场、实现品牌破圈的核心抓手。然而,面对市场上形形色色的谷歌SEO服务商,出海企业该如何筛选出真正靠谱的合作伙伴?本文将从行业百科视角出发,系统梳理谷歌SEO服…

2026/9/25 3:46:59 阅读更多 →
dsoFramer_V2.3.0.2:Windows桌面Office原生嵌入实战指南

dsoFramer_V2.3.0.2:Windows桌面Office原生嵌入实战指南

简介:本资源为dsoFramer V2.3.0.2完整源码工程包,面向Windows桌面开发中高级工程师及COM/ActiveX控件定制开发者,解决DLL框架二次开发、插件化扩展与VS环境适配等核心问题。压缩包共106个文件,含8个关键头文件(.h&…

2026/9/25 3:46:59 阅读更多 →
Playnite 使用指南:三步把多平台游戏和模拟器合并进一个库

Playnite 使用指南:三步把多平台游戏和模拟器合并进一个库

Playnite 使用指南:三步把多平台游戏和模拟器合并进一个库 【免费下载链接】Playnite Video game library manager with support for wide range of 3rd party libraries and game emulation support, providing one unified interface for your games. 项目地址:…

2026/9/25 3:45:59 阅读更多 →

日新闻

AI元人文:从工具使用到思维重构的深度探索

AI元人文:从工具使用到思维重构的深度探索

最近半年我一直在琢磨一件事:AI元人文到底是什么?说白了,就是“用元视角重新审视人与AI的关系”,也在“探索AI如何反向逼着我们发现自己的思考边界”。标题里的“元探索”,在我看就是一层套一层的追问——当你用AI解决…

2026/9/25 0:00:41 阅读更多 →
Python+CNN车牌识别实战:从数据预处理到模型训练与部署

Python+CNN车牌识别实战:从数据预处理到模型训练与部署

简介:基于Python与卷积神经网络的车牌识别项目,面向计算机视觉初学者及智能交通开发者,目标是帮助用户掌握从数据预处理、模型构建到实际部署的完整流程。压缩包共25个文件,包含jpg/png图像样本、py训练脚本、md说明文档、dat数据…

2026/9/25 0:00:41 阅读更多 →
Vim基础操作全攻略:保存退出、模式切换与高频命令实战

Vim基础操作全攻略:保存退出、模式切换与高频命令实战

1. 项目概述1.1 核心需求解析今天聊聊Vim。写这个题目的原因是:几乎每个后端开发者、运维人员、数据工程师某天都会遇到一个场景——深夜加班,服务器登录界面只有黑底白字,编辑器只有vi/vim,你必须在五分钟内完成一次配置修改并保…

2026/9/25 0:00:41 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/24 14:34:13 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/24 9:10:42 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/24 14:33:56 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/24 12:50:34 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/24 14:33:48 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/24 12:49:17 阅读更多 →