【问题标题】:Can Eclipse's Refactor > Move be integrated with Git?Eclipse 的 Refactor > Move 可以与 Git 集成吗?
【发布时间】:2011-10-13 07:17:43
【问题描述】:

使用适用于 Java 的 IDE 的一大好处是您可以获得自动重构。我遇到的问题是,在使用 Refactor > Move 将类移动到不同的包中(将文件本身移动到文件系统中)之后,git status 显示文件在旧位置已删除,新位置的已添加。

我发现的解决方法很笨拙:

mv src/com/example/newpackage/Foo.java src/com/example/oldpackage/Foo.java
git mv src/com/example/oldpackage/Foo.java src/com/example/newpackage/Foo.java

有什么方法(当使用 Eclipse 的 Git 插件时)让重构执行 git mv 而不是简单的文件系统移动?

【问题讨论】:

  • 搬家后的实际状态是什么?是否都进行了更改(添加和删除)?如果是这样,请尝试git diff --cached -M。我发现有时你必须告诉 git 检测重命名,特别是因为它是在之后检测到的。
  • git 告诉我旧文件已被删除,而新文件未跟踪(因此未暂存)。我尝试了git diff --cached -M,并将新位置视为新文件。我应该寻找什么?
  • 这就是你没有看到变化的原因。 Git 不会对新文件做任何事情,直到它在索引中(它通过暂存移动到那里)。如果您暂存新文件,git statusgit diff --cached -M 都会将更改报告为重命名。如果差异变化太多,添加--name-status,它只会显示相似度指数(格式为RXX,其中XX是相似度百分比)。
  • 实际上,暂存两个文件仍然不会报告重命名;它报告一个删除和一个新文件。
  • 来自*.com/questions/2641146/… 看起来 git 默认情况下可能不会对 git status 进行重命名检测(这可能是一项昂贵的操作)。试试他们推荐的git commit --dryrun 命令。 git diff cached -M 是否报告了重命名?如果是这样,相似度指数高吗?我只用了一个文件移动和非常少量的更改进行了测试,重构可能有更多的更改可能会减少太多。

标签: java eclipse git


【解决方案1】:

这就是 Git 如何处理重命名/移动(删除旧文件并添加新文件)的方式。然后它检测文件的内容,并根据算法识别重命名。因此,即使它显示您删除和添加,如果您提交然后执行“git log --followmovedfilename”,它应该向您显示整个历史记录,甚至是重命名之前的历史记录。

【讨论】:

  • 好的,git log --name-only 确实告诉我只有新文件也被更改了,所以我想我很高兴。我刚刚挂断git status 并没有显示我“重命名”,但看起来在检查提交时它并不重要。聪明的吉特!谢谢你的教育,邓尼。 :)
  • 重要的是要注意,如果在“移动”文件时还修改了其内容,这将不起作用。在这种情况下,git 只会将其视为删除/添加。您需要确保分两个独立的步骤进行/提交您的移动更改(或内容更改)。
最近更新 更多