有几次,我看到过这样一种说法:如果你把一个函数从一个文件移到另一个文件,Git就可以追踪它。例如,此条目说,“Linus说,如果你将一个函数从一个文件移动到另一个文件,Git会告诉你跨越移动的那个单独函数的历史记录。”但是我对Git底层设计有一点了解,我不明白这是如何可能的。所以我想知道...这是正确的说法吗?如果是,那么这是怎么做到的?我的理解是,Git将每个文件的内容存储为Blob,并且每个Blob都有一个全局唯一的标识符,该标识符由其内容和大小的SHA哈希值生成。然后,Git将文件夹表示为树形结构。任何文件名信息都属于Tree,而不属于Blob,因此文件重命名会显示为对Tree的更改,而不是对Blob的更改。因此,如果我有一个名为“foo”的文件,其中包含20个函数,以及一个名为“bar”的文件,其中包含5个函数,然后我将其中一个函数从foo移动到bar(分别得到19和6),Git如何检测到我将该函数从一个文件移动到另一个文件?据我所知,这将导致2个新的Blob存在(一个用于修改后的foo,一个用于修改后的bar)。我意识到可以计算差异以显示函数是从一个文件移动到另一个文件的,但我不明白如何将与函数有关的历史记录与bar关联起来,而不是foo(至少不是自动的)。
如果Git实际上查看单个文件的内部,并计算每个函数的一个blob(这将是疯狂/不可行的,因为您必须知道如何解析任何可能的语言),那么我可以看到这可能是可能的。那么...这个说法是正确的还是不正确的?如果正确,那么我的理解缺少什么?
如果Git实际上查看单个文件的内部,并计算每个函数的一个blob(这将是疯狂/不可行的,因为您必须知道如何解析任何可能的语言),那么我可以看到这可能是可能的。那么...这个说法是正确的还是不正确的?如果正确,那么我的理解缺少什么?
git-diff-index
后端的信息。因此它通过(高)文本相似性来跟踪移动。基本上,为了帮助 git 跟踪重命名操作,你需要使用尽可能少的更改的中间提交,除了文件重命名之外。 - Fizz