【问题标题】:How does git create a file blame?git如何创建文件责备?
【发布时间】:2021-07-29 16:34:47
【问题描述】:

我最近了解了git blame 及其作用。我想知道 git 如何在文件中的每一行发生更改时找到它,即使是跨文件重命名也是如此。换句话说,我想知道责备算法是如何工作的。

【问题讨论】:

    标签: git blame git-blame


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 一个问题。一个文件的许多地方都可以有同一行。而且,当插入或删除其他内容时,一行可以更改其行号。如何记录这些更改,确保它不是不同的行?或者基本上“否定申请”是如何工作的。
    • 嗯,这就是 SCM 工具的全部意义所在,所有这些通常都是使用“diff”工具完成的,该工具曾经在 UNIX 下存在多年,并且确实非常聪明。查看git-scm.com/docs/git-diff 了解可以使用哪些选项和不同的算法。对基于行的文件执行此操作是一回事,对基因组分析执行此操作则更进了一步:它被告知可与语音识别相媲美。
    猜你喜欢
    • 2019-08-29
    • 1970-01-01
    • 2011-05-23
    • 2017-04-17
    • 2012-05-05
    • 2016-04-21
    • 2016-12-28
    • 2011-07-03
    • 2015-09-21
    相关资源
    最近更新 更多