2017-06-01 81 views
8

在Android Studio 2.3.2(在3.0中具有相同的行爲)從Java到Kotlin的轉換會創建一個新文件並刪除以前的文件。所以Git不知道這個轉換。並且git歷史記錄不會保存。在Intellij Idea中一切都很好。 IDE只是重命名文件,git保存歷史記錄。在Android Studio中如何做到這一點。在Android Studio中將文件(使用Git進行跟蹤)從Java轉換爲Kotlin

+0

此答案https://stackoverflow.com/a/39152021/70930解釋了Git如何識別文件重命名,並且沒有辦法明確告訴Git有關正在重命名的文件。 – Paul

+0

謝謝,但Android Studio和Idea有什麼區別。爲什麼Git在一種情況下可以跟蹤文件的內容,而在另一種情況下不能? –

+0

這是您在Android Studio和Idea中轉換的文件嗎?如果文件不同,那麼轉換後的更改量可能不同,因此在一種情況下會檢測到重命名,而另一種情況則不會。 – Paul

回答

10

Git會從已添加/已刪除的文件對中進行重命名,但前提是這些文件足夠接近,即文件是否被重命名爲沒有更改或少量更改。

當您應用java-to-kotlin轉換時,通常文件的每一行都會發生更改,以便git無法找到這些新舊文件彼此之間的關聯關係。

您可以使用以下兩個階段的方法來代替:

  • 只是改變.java文件的擴展.kt並提交;
  • 重命名它,應用轉換並提交修改的.kt文件。
+0

我用這種方法。第一次提交是確定的,並指示移動。然後我應用轉換並使用「修改」選項提交.kt文件(僅保留一個提交)。然後,最終的提交確實顯示「重命名」,但刪除和添加。我想這是因爲上面提到的原因。 –

+0

如果我創建了兩個提交(一個用於重命名java - > kt,一個用於實際轉換),那麼它將工作:鏈接保持不變。然而,這使得歷史有點尷尬,因爲第一個註釋指向一個完全無效的代碼... –

+0

當然,第一次提交會很奇怪。沒有任何選擇是理想的,但你必須在兩者之間進行選擇。您是否想要放棄文件的歷史記錄? – tasomaniac

0

Git實際上並不直接跟蹤重命名;它根據文件添加/刪除對來推斷它們。我假設Idea在重命名時運行的是git add,而Android Studio只是刪除舊文件。嘗試在新文件上運行git add,在舊文件上運行git rm,Git應該將它們顯示爲重命名。

+0

其實我無法手動控制這一切。我只是使用標準命令「將java文件轉換爲kotlin文件」,結果我得到了刪除舊文件並創建了新文件(已經添加到git中)。我的猜測是IDE不使用mv或git mv命令。所以我看到提交兩個文件:刪除Sample.java,並添加Sample.kt。我可以做的唯一事情是保存歷史記錄,以反轉Sample.java並將Sample.kt的內容保存到Sample.java。然後刪除Sample.kt並將Sample.java重命名爲Sample.kt。這是一種痛苦! –

+0

Git沒有內部重命名的概念。如果刪除一個文件並添加具有相同內容的另一個文件,它將啓發式地確定它是重命名的。你不能說它是重命名。這聽起來像你正在查看某個接口的潛在提交,它不會啓發式地確定重命名。您可以在複製/重命名步驟之前和之後鍵入'git status'嗎?之前和之後的狀態將是相同的。 – adzenith

0

正如在其他答案中提到的,git跟蹤文件的內容,而不是它的重命名。當git log--follow選項一起運行時,它顯示的歷史記錄不是重命名的,但它認爲只有當前和當前文件內容的相似度指數爲50%或更多(即少於文件行的一半)纔會重命名文件改變。

對於這種情況,大部分線路已經改變,你可以使用-M選項設置爲相似性指數較低的酒吧:

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

根據不同的情況下,你可能需要去甚至更低超過20%。