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