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

在Android Studio中将文件(用Git跟踪)从Java转换为Kotlin,git,android-studio,intellij-idea,kotlin,Git,Android Studio,Intellij Idea,Kotlin,Android Studio 2.3.2中从Java到Kotlin的转换(在3.0中,行为相同)会创建一个新文件并删除以前的文件。所以Git对这种转换一无所知。git历史记录不会保存。在我看来一切都很好。IDE只是重命名文件,git保存历史记录。在Android Studio中如何做到这一点。Git实际上并不直接跟踪重命名;它根据文件添加/删除对推断它们。我假设Idea在重命名时运行的是git add,而Android Studio只是删除旧文件。尝试在新文件上运行git add,在旧文件上运行

Android Studio 2.3.2中从Java到Kotlin的转换(在3.0中,行为相同)会创建一个新文件并删除以前的文件。所以Git对这种转换一无所知。git历史记录不会保存。在我看来一切都很好。IDE只是重命名文件,git保存历史记录。在Android Studio中如何做到这一点。

Git实际上并不直接跟踪重命名;它根据文件添加/删除对推断它们。我假设Idea在重命名时运行的是
git add
,而Android Studio只是删除旧文件。尝试在新文件上运行
git add
,在旧文件上运行
git rm
,git应将它们显示为重命名。

git猜测从添加/删除的文件对重命名,但前提是这些文件足够接近,即重命名文件时没有或很少更改

当您将java应用于kotlin转换时,通常文件的每一行都会发生变化,因此git无法找到这些新旧文件之间的某种关联

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

  • 只需将
    .java
    文件的扩展名更改为
    .kt
    并提交即可
  • 重新命名它,应用转换并提交修改后的
    .kt
    文件

如其他答案中所述,git跟踪文件的内容,而不是其重命名。当使用
--follow
选项运行
git log
时,它会显示不可重命名的历史记录,但是,只有当以前和当前文件内容的相似性索引为50%或以上时,即文件的行数少于一半时,它才会考虑重命名文件

在这种情况下,大多数行都已更改,您可以使用
-M
选项为相似性索引设置较低的栏:

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

根据具体情况,您可能需要降到20%以下。

如果这有助于未来的读者:

如果使用与IntelliJ集成的Git提交对话框(通过Ctrl+K提交),则在最新版本的右侧有一个复选框:☑ Extra commit for.java>.kt重命名


以这种方式提交对话框将创建两个提交,第一个提交只是将
.java
文件重命名为
.kt
文件,而没有任何内容更改。这有助于Git跟踪内容。

这个答案解释了Git如何识别文件重命名,并且没有办法明确告诉Git文件被重命名。谢谢,但是Android Studio和Idea之间的区别是什么。为什么Git在一种情况下可以跟踪文件的内容,而在另一种情况下则不能?它是您在Android Studio和Idea中转换的同一个文件吗?如果文件不同,那么转换后的更改量可能不同,因此在一种情况下检测到重命名,而在另一种情况下则没有。我只使用空的新类进行实验。它们是一样的。甚至生成的注释也是相同的。可能在空格和表格上有所不同。实际上我不能完全手动控制。我只是使用标准命令“将java文件转换为kotlin文件”,结果我删除了旧文件并创建了新文件(已经添加到git中)。我猜IDE不使用mv或git mv命令。所以我看到了两个提交文件:删除Sample.java和添加Sample.kt。保存历史记录的唯一方法是反转Sample.java并将Sample.kt的内容保存到Sample.java。然后删除Sample.kt并将Sample.java重命名为Sample.kt。真痛苦!Git没有重命名的内部概念。如果删除一个文件并添加另一个具有相同内容的文件,它将试探性地确定这是一个重命名。你不能说这是一个重命名。在我看来,您似乎正在查看某个接口的潜在提交,该接口不会试探性地确定重命名。您能否在复制/重命名步骤之前和之后键入
git status
?前后的状态将是相同的。我使用了这种方法。第一次提交是确定的,表示移动。然后我应用转换并使用“修正”选项提交.kt文件(只保留一个提交)。然后,最终提交确实显示“重命名”,但显示删除和添加。我想这是因为上面提到的原因。如果我创建两个提交(一个用于重命名java-->kt,一个用于实际转换),那么它会工作:链接会被维护。然而,这使得历史有点尴尬,因为第一条注释指向一个完全无效的代码……当然,第一次提交会很奇怪。没有一个选项是理想的,但你必须在两者之间做出选择。你想不想在文件上丢失你的历史记录?我创建了一个IntelliJ IDEA/Android Studio插件,在转换过程中自动负责重命名和提交文件:是否有GIT配置来更改整个repo过程中的相似性索引?例如,我希望我的项目的默认值为20%,我找不到任何值,但是你可以创建一个别名。我要求提供一个全局配置标志,因为我假设(不确定!)各种git客户端,如Android Studio、GitHub、SourceTree等,使用默认的50%相似性索引来显示更改。因此,如果我们可以全局更改此选项,所有这些工具将根据所需的值相应地显示差异。此选项不再存在,但您可以使用此插件:但请注意,当您将其转换为kotlin时,它会生成提交权限。