sergii-ziborov/weavatrix-git

GitHub: sergii-ziborov/weavatrix-git

一个零依赖、纯安全 Rust 编写的 Git 仓库只读解析库,提供确定性的进程内对象、引用、历史和位图读取,专为仓库分析和审计场景设计。

Stars: 0 | Forks: 0

# Weavatrix Git [![CI](https://static.pigsec.cn/wp-content/uploads/repos/cas/ad/ad5834178f7599af9fdda11629d49cae07f2997beec49821b2920eff5bfd50e7.svg)](https://github.com/sergii-ziborov/weavatrix-git/actions/workflows/ci.yml) [![crates.io](https://img.shields.io/crates/v/weavatrix-git.svg)](https://crates.io/crates/weavatrix-git) [![docs.rs](https://docs.rs/weavatrix-git/badge.svg)](https://docs.rs/weavatrix-git) `weavatrix-git` 是一个无依赖、只读的 Git 存储引擎,使用安全的 Rust 编写。 仓库分析工具可以直接获取类型化的证据,而无需启动 `git`、加载 C 库、执行钩子、评估过滤器或连接远程。 该 crate 不是一个第二个 Git 客户端。它的契约是确定性的本地智能:对象、引用、历史、可达性、index 状态以及更改。 ## 为什么需要单独的 crate? 扫描器用于发现文件。代码图用于建模关系。而本 crate 专门负责版本控制证据。保持这一边界的独立性,可以让任何 Rust 应用程序在不导入更庞大产品的情况下,复用 Git 智能。 ## 支持的契约 | 领域 | 支持 | | --- | --- | | 布局 | worktree、bare、`.git` 间接寻址、链接的 worktree `commondir` | | 哈希 | SHA-1 和 SHA-256 对象标识符 | | Refs | loose、symbolic、detached HEAD、packed refs、reflogs | | 对象 | commit、tree、blob、annotated tag | | Loose 存储 | 有界的 zlib/DEFLATE 解码(由本 crate 执行) | | Packed 存储 | PACK v2/v3、index v2、OFS_DELTA、REF_DELTA | | 对象查找 | alternates、经典 MIDX、可配置的对象/delta 缓存 | | Commit 加速 | 单体和拆分的 commit-graph 链 | | 路径加速 | 变更路径 Bloom filters v1/v2 | | 可达性 | pack 和 MIDX EWAH 位图,带有 RIDX 排序 | | Index | DIRC v2、v3 以及前缀压缩的 v4 | | 查询 | 类型化读取、惰性 revwalk、历史、tracked status、tree diff | | 扩展 | 有界的并行批处理和跨仓库关联 | | 扩展接口 | 有序、线程安全、只读的自定义 ODB 后端 | 所有公共读取操作均在进程内完成。库代码不包含任何子进程后备方案。不支持的数据将返回类型化的错误,而不是近似的答案。 ## 用法 ``` use weavatrix_git::{PathBloom, Repository}; fn main() -> Result<(), Box> { let repository = Repository::open(".")?; let head = repository.resolve("HEAD")?; for id in repository.revwalk().push_head()?.take(100) { println!("{}", id?); } if repository.commit_maybe_changed_path(head, b"src/lib.rs")? == Some(PathBloom::DefinitelyNot) { println!("the commit definitely did not change src/lib.rs"); } if let Some(objects) = repository.bitmap_reachable(head)? { println!("{} reachable objects", objects.len()); } Ok(()) } ``` 自定义存储使用相同的对象契约: ``` use std::sync::Arc; use weavatrix_git::{Limits, MemoryObjectBackend, Repository}; let backend = Arc::new(MemoryObjectBackend::default()); let repository = Repository::open_with_backends(".", Limits::default(), vec![backend])?; # Ok::<_, weavatrix_git::GitError>(repository) ``` 对于跨仓库分析,`RepositorySet` 保持对象存储相互隔离,并返回确定性的串行或并行结果: ``` use weavatrix_git::{HistoryOptions, RepositorySet}; let repositories = RepositorySet::open([ ("service", "/code/service"), ("client", "/code/client"), ])?; let histories = repositories.histories_parallel(HistoryOptions::default())?; let shared = repositories.shared_commits(HistoryOptions::default())?; # Ok::<_, weavatrix_git::GitError>((histories, shared)) ``` 诊断 CLI 使用了该库: ``` weavatrix-git [-C repository] head weavatrix-git [-C repository] log [revision] [max-count] weavatrix-git [-C repository] cat weavatrix-git [-C repository] diff ``` ## 架构 ``` Repository +-- refs + reflog +-- commit-graph chain + changed-path Bloom +-- index -> tracked status +-- custom ODB backends +-- object directories + alternates +-- loose object -> bounded zlib +-- MIDX -> pack -> bounded delta chain +-- pack/MIDX bitmap -> reachable object IDs ``` `Limits` 限制了对象字节、缓存字节、delta/ref/tree 深度、tree 和 index 条目、reflog/历史长度、父提交数量以及位图扩展。该 crate 禁止使用不安全的 Rust。 ## 正确性 测试套件会创建真实的 Git 仓库并验证: - loose 和深度压缩的 OFS/REF delta 对象; - SHA-1 和 SHA-256 仓库; - bare 和 linked-worktree 布局; - 经典的 MIDX 查找; - 多层拆分的 commit-graphs 和变更路径 Bloom 结果; - pack 和 MIDX 位图可达性与 `git rev-list --objects` 的对比; - index v2 和 v4、reflog 顺序、revwalk 隐藏/重置以及 tracked status; - 确定性的并行和跨仓库结果; - 恶意格式和已配置限制的失败处理。 当前的行覆盖率为 85.70%。CI 在 Linux、Windows 和 macOS 上运行 Rust 1.88,并执行 Clippy(警告将被视为错误)、覆盖率测试、审计、文档生成和软件包验证。 ## 性能 在 Windows 上的发布测量结果,2026-07-27: | 精确一致性操作 | `weavatrix-git` p50 | `git.exe` p50 | | --- | ---: | ---: | | 6,000 个对象的位图可达性 | 0.431 ms | 72.656 ms | | 单条目 index 读取 | 0.033 ms | 60.758 ms | | 无更改的 tracked status | 0.186 ms | 72.735 ms | | 缓存的 commit 查找 | 0.001 ms | 65.267 ms | | 1,000 个 commit 的历史记录,复用仓库 | 0.416 ms | 68.145 ms | 这些行将进程内的直接读取器与新建的 CLI 进程进行了对比。它们并非针对进程内的 `gix` 或 `libgit2` 所作的主张。每个测试工具在记录时间之前都会检查输出的一致性。请参阅 [BENCHMARKS.md](BENCHMARKS.md)。 ## 在同类替代品中的定位 | 能力 | `weavatrix-git` | Git CLI | `gix` | `libgit2` | | --- | --- | --- | --- | --- | | 进程内执行 | 是 | 否 | 是 | 是 | | 纯安全 Rust | 是 | 否 | 是 | 否,C 核心 | | crate 依赖 | 零 | 不适用 | 许多模块化 crate | 原生库 | | 对象/delta 缓存 | 是 | 是 | 是 | 是 | | MIDX 和可达性位图读取 | 是 | 是 | 是 | 是 | | 拆分 commit-graph 和路径 Bloom 读取 | 是 | 是 | 是 | commit-graph | | 自定义只读 ODB | 是 | 不适用 | 存储抽象 | 是 | | 惰性 revwalk、reflog、index、tracked status | 是 | 是 | 是 | 是 | | 网络和修改 | 否 | 是 | 是 | 是 | 有意排除在外的功能包括:pack index v1、reftable、增量 MIDX 链、拆分/稀疏 index 扩展、shallow 和 replace-object 语义、revision-expression 语法、untracked/ignore/filter-aware 状态、submodule worktree 状态、网络操作以及修改。 如果需要完整的客户端,请使用 Git、`gix` 或 `libgit2`。当有界的本地证据、较小的审计范围、确定性读取和零依赖性至关重要时,请使用此 crate。 ## 许可证 MIT
标签:Git, Rust, 代码分析, 凭证管理, 可视化界面, 存储引擎, 安全可观测性, 版本控制, 网络安全研究, 网络流量审计, 解析库, 通知系统