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

mai*_*ove 2 git

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

git提交

当我使用命令时:

git log test.txt
Run Code Online (Sandbox Code Playgroud)

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

在我看来:

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

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

kni*_*ttl 5

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

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