gpt4 book ai didi

git - 使用 libgit2 高效地获取 git 存储库中的作者列表

转载 作者:行者123 更新时间:2023-12-03 11:27:39 24 4
gpt4 key购买 nike

我需要获取 git 存储库的作者列表,就像命令行中的 git shortlog -s 一样。

我目前正在做的工作是进行一次 revwalk(遍历所有修订)并一次收集所有提交的作者列表,但这相当慢,尤其是与命令行 git 命令。

我正在使用 Rust,但我希望解决方案在 C 或其他绑定(bind)到 libgit2 的语言中是相似的。

这是我当前工作但速度较慢的代码:

        let repo = Repository::open(&git_path)?;
let mut revwalk = repo.revwalk()?;
revwalk.push_head()?;
let mut authors: Vec<String> = revwalk
.map(|r| {
let oid = r?;
repo.find_commit(oid)
})
.filter_map(|c| match c {
Ok(commit) => Some(commit),
Err(e) => {
println!("Error walking the revisions {}, skipping", e);
None
}
})
.fold(HashSet::new(), |mut sofar, cur| {
if let Some(name) = cur.author().name() {
sofar.insert(name.to_string());
}
sofar
})
.into_iter()
.collect();
authors.sort();

编辑 好的,在 Release模式下使用 Rust 构建时,速度明显更快。我仍然想知道是否还有更有效的方法。

最佳答案

不幸的是,没有更有效的方法,除非您对存储库结构有所了解(例如,特定点之前的所有提交都是由特定用户进行的)。如果您想了解有关每个提交的信息,则必须遍历每个提交。 Git 不为这些信息提供缓存,因此需要遍历历史。

libgit2 更通用一些,可能无法利用与 Git 本身相同的优化,但整体算法是相同的。

关于git - 使用 libgit2 高效地获取 git 存储库中的作者列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60464449/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com