2011-10-10 36 views
1

我很感興趣如何git log -- filename內部工作。git文件日誌如何在內部工作?

這是否會通過存儲庫中的所有樹對象,搜索文件名字符串,然後從使用不同blob-id的提交對象返回所有日誌消息? (我無法想象這個工程的大型資料庫。)

背景:

我不得不指數與Apache Lucene的Git倉庫的全部內容,並需要快速的文件歷史記錄。當git log --filename是一個緩慢的命令,也許最好將一個提交的所有Blob-ID添加到Lucene-Commit-文檔中以獲得快速文件歷史記錄?

回答

3

這幾乎是它所做的,它是一個相當快的操作。普通ol'git log走整個提交樹,以便工作是給定的。爲了僅選擇與文件相關的提交,只需要讀取每個提交對象,取出它們的樹,讀取該樹,等等,直到它到達所討論的文件,並獲得blob的SHA1 。然後它可以檢查SHA1是否與之前的提交相同。

它當然不需要通過全部樹,只是檢查該blob所需的樹,而「搜索文件名字符串」有點誤導 - 樹數據採用已知格式。

因此,確實需要比遍歷歷史長一點,但不是一噸。每次提交只需額外讀取一些內容,而不會增加算法的複雜性。

+0

感謝您的澄清。 – Sonson