使用正则表达式和 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
一个来一次喂养它们。