Git的“日志文件名”是如何在内部实现的

时间:2014-01-17 05:15:19

标签: git

我知道Git不会将数据存储为一系列更改集或增量,而是存储为一系列快照。因此,一个文件的两个版本之间没有直接关系,如图所示:

git commits

当我使用命令时:

git log test.txt

Git如何在其文件系统中找到“版本1和版本2”日志?

在我看来:

Git将遍历所有提交对象(带有父引用),然后遍历树等,以获取特定文件的每个日志信息。

但是,这看起来效率不高; Git是否有一些特定的算法来提取日志信息或存储一些额外的信息来获取它?

2 个答案:

答案 0 :(得分:5)

你的假设是正确的。对于最简单的情况(通过路径名限制日志输出),它的工作原理如下:

  • 从提交中获取树
  • 路径中是否存在路径?
  • 与此路径关联的blob的SHA1是否与之前的提交不同? - > 输出
  • 获取下一个(父)提交。重复。

答案 1 :(得分:4)

它比你想象的更有效率。这些东西的实际数据只需很少的I / O读入,因为git写入包的方式 - 类似大小的东西是相邻的,所以每棵树的历史很可能被顺序存储并且压缩得非常好,因为当地。 I / O比减压慢很多,这是一个胜利。然后,由于树的SHA是其自身的SHA及其所有子树,因此git可以轻易地检测子树何时与其父项相同并采取早期出现。这种情况经常发生,因为很少有文件在每次提交时都会发生变化。

总而言之,它足够快,在实践中不会出现问题。