Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 可以Eclipse';s重构>;移动可以与Git集成吗?_Java_Eclipse_Git - Fatal编程技术网

Java 可以Eclipse';s重构>;移动可以与Git集成吗?

Java 可以Eclipse';s重构>;移动可以与Git集成吗?,java,eclipse,git,Java,Eclipse,Git,使用面向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 sr

使用面向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处理重命名/移动(删除旧文件并添加新文件)的方式。然后它检测文件的内容,并根据算法识别重命名。因此,即使它显示您删除和添加,如果您提交并执行“git日志-跟随movedfilename”,它也应该显示整个历史,甚至是重命名之前的历史。

移动后的实际状态是什么?这两个更改(添加和删除)是否都已暂存?如果是这样,请尝试使用git diff--cached-M。我发现,有时您必须告诉git检测重命名,特别是因为它是在之后检测到的。git向我显示,旧文件已被删除,而新文件未被跟踪(因此未暂存)。我尝试了
git diff--cached-M
,并将新位置视为一个新文件。我应该寻找什么?这就是为什么你没有看到变化的原因。Git不会对一个新文件做任何事情,除非它在索引中(通过暂存将其移动到那里)。如果暂存新文件,则
git status
git diff--cached-M
都会将更改报告为重命名。如果差异中有太多的更改,添加
--name status
,它只会显示相似性索引(以RXX的形式,其中XX是相似性百分比)。实际上,暂存两个文件仍然不会报告重命名;它报告了一个删除和一个新文件。从它看来,git在默认情况下可能不会对git状态进行重命名检测(这可能是一个昂贵的操作)。尝试他们推荐的
gitcommit--dryrun
命令。git diff cached-M是否报告了重命名?如果是,相似性指数高吗?我只做了一个文件移动和一个非常小的改动就完成了测试,重构可能有更多的改动,这可能会使它减少太多。好吧,
git log--name only
确实告诉我,只有新文件也被改动了,所以我想我已经很高兴了。我刚刚挂断了git状态的链接,没有显示“重命名”,但在检查提交时,它看起来一点也不重要。聪明的傻瓜!谢谢你的教育,邓尼。:)重要注意事项:如果在“移动”文件的同时也修改了其内容,则此操作不起作用。在这种情况下,git只会将其视为删除/添加。您需要确保在两个独立的步骤中进行/提交移动更改(或内容更改)。