git 如何创建一个文件 blame?

How does git create a file blame?

我最近了解了 git blame 及其功能。我想知道 git 如何找到文件中每一行的更改时间,甚至跨文件重命名。换句话说,我想知道责备算法是如何工作的。

首先,几乎所有其他 SCM 都存在 blame 特性,包括 CVS。因此所使用的算法会根据您使用的工具而有所不同。

然而,基本上,实现此目的的最简单方法是从文件的最新状态开始,然后向后浏览历史记录(向过去)并应用每个变更集的负数。

每个受影响的行都被标记为属于最后一次提交,所有其他行都属于前一个。除此之外,您将计算后面这些行的数量。然后使用提交 n-1 和 n-2 重新启动此过程。如果行不明确属于“n-1”,它们将被忽略,因为这意味着它们已被最近的一些提交更改(实际上,反向变更集仍将应用,但提交编号不会更新).否则,您应用相同的计算,更新每行所属的提交编号。

然后,如果需要,您只需要一直迭代直到初始提交,但如果您达到上面引用的“行数”达到零的状态,您知道您可以在此处停止,因为这意味着自文件的原始状态以来,所有行都已更改,因此无需再进行任何操作。