为什么我在Eclipse中进行移动重构之后,Git文件历史记录丢失了?

6
我在Eclipse中进行了几次重构,将一组大型文件移动到另一个Java包中。这通常会导致许多文件被自动更新以解决引用问题。因此,在这些情况下提交的内容往往相当大。
我假设git跟踪重命名,并且可以使用git log --follow通过重命名跟踪历史记录,但是git没有跟踪重命名。
我在Eclipse中执行了较小的重构操作,其中重命名在提交时被检测到。唯一的区别似乎是提交的大小。
有什么想法吗?

此外,看起来EGit Eclipse插件没有指定git log的-M或-l值的方法(如cdhowie所提到的)。因此,如果您想使用这些标志,就必须使用CLI。 - Jonathan
2
EGit(确切地说是JGit)尊重diff.renameLimit设置。默认值为200,但您可以在全局或每个存储库的git配置中将其配置为更高的值。 - robinst
1个回答

7
Git不会在历史记录中跟踪重命名操作,但是git log可以通过对提交内容的启发式检测来检测重命名操作。
你可能需要在git log命令中指定一个较低的-M百分比,以便能够检测到重命名操作。如果文件更改的百分比超过一定程度,git log(和git diff)就不会将添加/删除操作视为重命名操作。如果移动的文件非常小且需要更改内容(例如包名称),则它们可能超过此阈值。
你可能还需要为-l指定一个值,该值指定要评估的潜在重命名操作的最大数量。在大型提交中,您可能已经超过了这个值,因此Git不会评估重命名操作,以避免日志操作耗费太长时间。(检测重命名操作是一个O(n ^ 2)操作,其中n是需要考虑的添加/删除操作的数量,因此处理查找重命名操作的日志操作每个提交所需的时间随着添加/删除排列组合的数量呈指数级增加。)
有关这些选项的更详细描述,请参见git-log手册页。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接