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

Search for a pattern using a regular expression and libgit2

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

git grep -G pattern revision

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

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

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

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

libgit2 没有 git grep 等价物,因为它远不及基本的 Git 操作。这是非常高的水平,实际有趣的工作(高效的 grep)与 Git 无关,所以 libgit2 将不是放置该代码的地方。

由于您看到的问题归根结底是因为分叉比其他任何事情都更昂贵,所以我认为有两种方法可以避免这种情况。一种是使用 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 三元组(可能 easier/cheaper 将那些 cut 替换为您自己的提取代码来自 ls-tree 的流的 ID)。或者您可以使用 libgit2 遍历树并递归地从树中获取所有 blob,这最终会以稍微不同的方式为您提供相同的信息。

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

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