我非常感兴趣git log -- filename
内部如何运作。
这是否遍历存储库中的所有树对象,搜索文件名字符串,然后从使用不同blob-id的提交对象返回所有日志消息? (我无法想象这适用于大型存储库。)
背景:
我必须使用Apache Lucene索引git存储库的全部内容,并且需要快速的文件历史记录。当git log --filename
是一个慢命令时,也许最好将提交的所有blob-ID添加到Lucene-Commit文档中以获取快速文件历史记录?
答案 0 :(得分:3)
这几乎就是它的作用,而且这是一个相当快速的操作。简单的'git log
遍历整个提交树,因此工作是给定的。为了只选择触摸文件的提交,它只需要读取每个提交对象,读取它们的树,读取该树,依此类推,直到它到达相关文件,然后获取blob的SHA1 。然后,它可以检查SHA1是否与上一次提交中的相同。
它当然不必通过所有树,只需检查那个blob,并且“搜索文件名字符串”有点误导 - 树数据是以已知的格式。
当然,它需要的时间比穿越历史要长一些,但不是一吨。每次提交只需要一些额外的读取,而不是算法复杂性的增加。