【发布时间】:2009-11-13 12:26:50
【问题描述】:
显然,当您将一个函数从一个源代码文件移动到另一个源代码文件时,git 修订日志(对于新文件)可以显示该代码片段最初来自哪里(例如,参见 @987654321 中的查看历史记录部分@)。
这是如何工作的?
【问题讨论】:
标签: git version-control dvcs
显然,当您将一个函数从一个源代码文件移动到另一个源代码文件时,git 修订日志(对于新文件)可以显示该代码片段最初来自哪里(例如,参见 @987654321 中的查看历史记录部分@)。
这是如何工作的?
【问题讨论】:
标签: git version-control dvcs
它不会跟踪它们。这就是它的美妙之处。
Git 只记录整个项目树的快照:这是提交前的所有文件的样子,以及提交后的样子。 如何我们从这里到那里,Git 不在乎。
这允许在提交已经发生之后编写智能工具,以从该提交中提取信息。例如,Git 中的重命名检测是通过将所有已删除文件与所有新文件进行比较并比较成对相似度指标来完成的。如果相似度度量大于x,则认为是重命名,如果在y和x(y < x)之间,则认为是重命名+编辑,如果低于@987654326 @,它们被认为是独立的。很酷的事情是,作为“承诺考古学家”,您可以在事后指定 x 和 y 应该是什么。如果提交只是记录“这个文件是那个文件的重命名”,这将不起作用。
检测移动的内容的工作方式类似:您将每个文件切成小块,计算所有切片之间的相似度指标,然后可以推断出在此处删除的切片和在此处添加的非常相似的切片实际上是相同的切片从这里搬到那里。
但是,正如 tonfa 在他的回答中提到的那样,这是非常昂贵的,因此通常不会这样做。但它可以完成,这就是重点。
顺便说一句:这与 Google Wave、EtherPad、Gobby、SubEthaEdit、ACE 和 Co. 使用的运营转型模型几乎完全相反。
【讨论】:
这纯粹是一种启发式方法。它比较文件之间的距离并尝试找到匹配的块。但是这种启发式只有在代码被复制或移动到新文件时才会实现(否则检查每一对文件的成本太高了)。
【讨论】:
-M 和 -C 选项的文档。