gpt4 book ai didi

c++ - 使用正则表达式和 libgit2 搜索模式

转载 作者:太空宇宙 更新时间:2023-11-04 13:17:05 27 4
gpt4 key购买 nike

我有一个应用程序生成一个进程,以便通过运行在 git 存储库中的特定提交中查找特定正则表达式的出现:

git grep -G pattern revision

这工作得很好,但问题是我在循环中执行此操作,而且速度非常慢。我分析了 Linux 上的代码和对 __libc_fork 的调用单独占用 94% 的运行时间。

显然,我想避免这种不必要的开销。为了执行其他一些 git 操作,我已经在我的应用程序中使用了 libgit2,但是我没有看到像使用 git grep 那样执行正则表达式搜索的便捷方法。 .我可以想象手动浏览与提交关联的所有文件并执行搜索,但我希望有一个更优雅的解决方案,最多几行。

我是否缺少相关的 libgit2 API?有谁知道使用 libgit2 搜索模式的快速方法?

编辑 澄清一下:在我的循环中,修改是固定的,但模式改变了。

最佳答案

libgit2 没有 git grep 等价物,因为那离基本的 Git 操作还很远。它的级别非常高,实际有趣的工作(高效的 grep)与 Git 无关,因此 libgit2 不适合放置该代码。

由于您看到的问题归根结底是因为 fork 比其他任何事情都更昂贵,所以我认为有两种方法可以避免这种情况。一种是使用 git cat-file--batch 选项为其提供要显示的对象列表,您可以获得例如来自 ls-tree 喜欢

git ls-tree -r ${revision} | cut -f 1 | cut -d ' ' -f 3 | git cat-file --batch

它会在每个文件的开头生成一个带有 $id $type $len 三元组的机器可读输出(替换那些 cut 可能更容易/更便宜使用您自己的代码从来自 ls-tree 的流中提取 ID。或者您可以使用 libgit2 遍历树并递归地从树中获取所有 blob,这最终会以稍微不同的方式为您提供相同的信息。

然后您可以使用某种形式的 grep 来运行这些缓冲区。您最喜欢的编程语言可能有 pcre 的实现或绑定(bind)到您可以提供这些文件的库。

无论您选择哪种提取方法,您都应该能够通过每个对象之前的那些三元组一次一个地从 cat-file 中读取一个来一次喂养它们。

关于c++ - 使用正则表达式和 libgit2 搜索模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36891409/

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