sergii-ziborov/weavatrix-git
GitHub: sergii-ziborov/weavatrix-git
一个零依赖、纯安全 Rust 编写的 Git 仓库只读解析库,提供确定性的进程内对象、引用、历史和位图读取,专为仓库分析和审计场景设计。
Stars: 0 | Forks: 0
# Weavatrix Git
[](https://github.com/sergii-ziborov/weavatrix-git/actions/workflows/ci.yml)
[](https://crates.io/crates/weavatrix-git)
[](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
标签:Git, Rust, 代码分析, 凭证管理, 可视化界面, 存储引擎, 安全可观测性, 版本控制, 网络安全研究, 网络流量审计, 解析库, 通知系统