git - Git的 ‘log filename’内部是怎么实现的

标签 git

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

git commits

当我使用命令时:

git log test.txt

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

在我看来:

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

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

最佳答案

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

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

关于git - Git的 ‘log filename’内部是怎么实现的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21178383/

相关文章:

git - 告诉 git 跟随移动的内容(不仅仅是移动的文件)

git - 如何从 git 跟踪中删除文件?

gitignore 忽略中间有空格的文件夹中的文件

gitk 只显示指定的分支

git - 如何为所有子域设置 Git 配置选项?

git - 如何从浅克隆中有效地获取 git

git - 如何使用SSH隧道转发git协议(protocol)?

git 列出远程分支,按提交数量排序

git - 修复损坏的 git 仓库——如何重新开始

Git 使多个 Remote 保持同步的正确方法?