git文件日志内部如何工作?

时间:2011-10-10 14:40:43

标签: git lucene

我非常感兴趣git log -- filename内部如何运作。

这是否遍历存储库中的所有树对象,搜索文件名字符串,然后从使用不同blob-id的提交对象返回所有日志消息? (我无法想象这适用于大型存储库。)

背景:

我必须使用Apache Lucene索引git存储库的全部内容,并且需要快速的文件历史记录。当git log --filename是一个慢命令时,也许最好将提交的所有blob-ID添加到Lucene-Commit文档中以获取快速文件历史记录?

1 个答案:

答案 0 :(得分:3)

这几乎就是它的作用,而且这是一个相当快速的操作。简单的'git log遍历整个提交树,因此工作是给定的。为了只选择触摸文件的提交,它只需要读取每个提交对象,读取它们的树,读取该树,依此类推,直到它到达相关文件,然后获取blob的SHA1 。然后,它可以检查SHA1是否与上一次提交中的相同。

它当然不必通过所有树,只需检查那个blob,并且“搜索文件名字符串”有点误导 - 树数据是以已知的格式。

当然,它需要的时间比穿越历史要长一些,但不是一吨。每次提交只需要一些额外的读取,而不是算法复杂性的增加。