问题 在Java Studio中将文件(使用Git跟踪)从Java转换为Kotlin


在Android Studio 2.3.2中从Java到Kotlin的转换(3.0中的行为相同)会创建一个新文件并删除之前的文件。所以Git对此转换一无所知。并且git历史不会保存。在Intellij Idea中一切都很好。 IDE只重命名文件,git保存历史记录。如何在Android Studio中执行相同操作。


11907
2018-06-01 14:29


起源

这个答案 stackoverflow.com/a/39152021/70930 解释了Git如何识别文件重命名,并且没有办法明确告诉Git有关重命名的文件。 - Paul
谢谢,但Android Studio和Idea之间有什么区别。为什么Git在一个案例中可以跟踪文件的内容而在另一种情况下不能? - Eugene Verichev
它是您在Android Studio和Idea中转换的文件吗?如果文件不同,则转换后的更改量可能不同,因此在一种情况下检测到重命名,而在另一种情况下则不是。 - Paul
我只使用空的新类进行实验。他们是一样的。即使生成的评论也是一样的。可能是空格和表格有所不同。 - Eugene Verichev


答案:


Git从添加/删除的文件对中猜测重命名,但前提是这些文件足够接近,即文件是在没有或少量更改的情况下重命名的。

当您应用java-to-kotlin转换时,通常文件的每一行都会发生变化,因此git无法找到这些旧文件和新文件以某种方式相互关联。

您可以使用以下两阶段方法:

  • 只是改变扩展名 .java 归档到 .kt 并承诺;
  • 将其重命名,应用转换并提交修改后的内容 .kt 文件。

12
2018-06-02 03:48



我用这种方法。第一次提交是OK,表示移动。然后我应用转换并使用“Amend”选项提交.kt文件(仅保留一次提交)。然后,最终提交确实显示“重命名”,但删除和添加。我想这是因为上面提到的原因。 - Damien Coraboeuf
如果我创建两个提交(一个用于重命名java - > kt,一个用于实际转换),那么它可以工作:链接被维护。然而,这使得历史有点尴尬,因为第一个评论指向一个完全无效的代码...... - Damien Coraboeuf
当然第一次提交会很奇怪。没有一个选项是理想的,但你必须在两者之间做出选择。你想在文件上丢失你的历史记录吗? - tasomaniac
我创建了一个IntelliJ IDEA / Android Studio插件,可以在转换过程中自动重命名和提交文件: github.com/denis-colliot/vcs-kotlin-converter - Denis Colliot


Git实际上并不直接跟踪重命名;它根据文件添加/删除对推断出它们。我认为Idea正在运行 git add 当它重命名时,Android Studio只是删除旧文件。试试跑步 git add 你自己的新文件和 git rm 在旧文件和Git应该显示为重命名。


0
2018-06-01 15:15



实际上我无法手动控制这一切。我只是使用标准命令“将java文件转换为kotlin文件”结果我得到了删除旧文件并创建了新文件(已经添加到git中)。我的猜测是IDE不使用mv或git mv命令。所以我看到staged for commit两个文件:删除了Sample.java,并添加了Sample.kt。我唯一可以保存历史记录的是反转Sample.java并将Sample.kt的内容保存到Sample.java。然后删除Sample.kt并将Sample.java重命名为Sample.kt。真是太痛苦了! - Eugene Verichev
Git没有重命名的内部概念。如果您删除一个文件并添加具有相同内容的另一个文件,它将启发式地确定它是重命名。你无法告诉它这是一个重命名。听起来像你正在查看某个界面的潜在提交,而这个界面并没有启发式地确定重命名。你可以键入 git status 在你复制/重命名步骤之前和之后?之前和之后的状态将是相同的。 - adzenith


正如其他答案中所提到的,git跟踪文件的内容,而不是它的重命名。什么时候 git log 与...一起运行 --follow 选项,它显示除重命名之外的历史记录,但是只有当前一个和当前文件内容具有50%或更高的相似性索引,即小于文件行的一半已经改变时,它才认为要重命名文件。

对于这种情况,大多数行都已更改,您可以使用相应索引设置较低的条形 -M 选项:

git log -M20% --follow -- /path/to/file

根据具体情况,您可能需要甚至低于20%。


0
2017-07-31 13:39



是否有GIT配置来更改整个仓库中的相似性指数?例如。我希望我的项目的默认值为20% - Vesko
我找不到任何东西,但你总能创建一个别名 - Giorgos Kylafas
我要求一个全局配置标志,因为我假设(虽然不确定!)各种git客户端,如Android Studio,GitHub,SourceTree等使用50%的默认相似性索引来显示更改。因此,如果我们可以全局更改它,所有这些工具将根据所需的值相应地显示差异。 - Vesko