【发布时间】:2021-07-29 16:34:47
【问题描述】:
我最近了解了git blame 及其作用。我想知道 git 如何在文件中的每一行发生更改时找到它,即使是跨文件重命名也是如此。换句话说,我想知道责备算法是如何工作的。
【问题讨论】:
我最近了解了git blame 及其作用。我想知道 git 如何在文件中的每一行发生更改时找到它,即使是跨文件重命名也是如此。换句话说,我想知道责备算法是如何工作的。
【问题讨论】:
首先,blame 功能也存在于几乎所有其他 SCM 中,包括 CVS。因此,使用的算法会根据您使用的工具而有所不同。
然而,基本上,实现这一点的最简单方法是从文件的最新状态开始,然后向后(向过去)浏览历史记录并应用每个变更集的负数。
每个受影响的行都被标记为属于最后一次提交,所有其他行都属于前一个。除此之外,您将计算后面这些行的数量。然后使用提交 n-1 和 n-2 重新启动此过程。如果行不明确属于“n-1”,它们将被忽略,因为这意味着它们已被最近的提交更改(实际上,仍将应用反向变更集,但不会更新提交编号)。否则,您应用相同的计算,更新每行所属的提交号。
然后,您只需一直向下迭代直到初始提交(如果需要),但如果您达到上面引用的“行数”达到零的状态,您知道您可以在这里停止,因为这意味着所有自文件的原始状态以来,行已被更改,无需再进一步。
【讨论】: