2017-06-01 88 views
8

Chuyển đổi từ Java sang Kotlin trong Android Studio 2.3.2 (trong cùng một hành vi 3.0) tạo tệp mới và xóa trước đó. Vì vậy, Git không biết gì về việc chuyển đổi này. Và lịch sử git không lưu. Trong Intellij Idea mọi thứ đều ổn. IDE chỉ đổi tên tệp và git lưu lịch sử. Làm thế nào có thể làm tương tự trong Android Studio.Chuyển đổi tệp (được theo dõi bằng Git) từ Java sang Kotlin trong Android Studio

+0

Câu trả lời này https://stackoverflow.com/a/39152021/70930 giải thích cách Git xác định đổi tên tệp và không có cách nào để cho Git biết rõ ràng về tệp đang được đổi tên. – Paul

+0

Cảm ơn bạn, nhưng sự khác biệt giữa Android Studio và Idea. Tại sao Git trong một trường hợp có thể theo dõi nội dung của tập tin và trong trường hợp khác thì không thể? –

+0

Đây có phải là cùng một tệp bạn đang chuyển đổi trong Android Studio và Idea không? Nếu các tệp khác nhau, thì có thể số lượng thay đổi sau khi chuyển đổi là khác nhau, do đó, trong một trường hợp đổi tên được phát hiện và trong trường hợp khác thì không. – Paul

Trả lời

10

Git đoán đổi tên từ cặp tệp được thêm/xóa, nhưng chỉ khi những tệp này đủ gần, tức là nếu tệp được đổi tên không có hoặc số lượng thay đổi nhỏ.

Khi bạn áp dụng chuyển đổi java-to-kotlin thường thì mọi dòng của tệp đều thay đổi, để git không thể tìm thấy các tệp cũ và mới này có liên quan với nhau.

Bạn có thể sử dụng phương pháp hai giai đoạn sau thay vì:

  • chỉ cần thay đổi phần mở rộng của tập tin .java để .kt và cam kết nó;
  • đổi tên lại, áp dụng chuyển đổi và cam kết tệp .kt đã sửa đổi.
+0

Tôi đã sử dụng phương pháp này. Cam kết đầu tiên là OK và cho biết di chuyển. Sau đó, tôi áp dụng chuyển đổi và cam kết tệp .kt sử dụng tùy chọn "Sửa đổi" (để chỉ giữ một lần commit). Sau đó, cam kết cuối cùng sẽ hiển thị "đổi tên" nhưng xóa và thêm. Tôi đoán đây là vì những lý do nêu trên. –

+0

Nếu tôi tạo hai cam kết (một cho việc đổi tên java -> kt, một cho chuyển đổi thực tế), sau đó nó hoạt động: liên kết được duy trì. Tuy nhiên, điều này làm cho lịch sử một chút khó xử kể từ khi nhận xét đầu tiên trỏ đến một mã hoàn toàn không hợp lệ ... –

+0

Tất nhiên cam kết đầu tiên sẽ là lạ. Không có lựa chọn nào là lý tưởng nhưng bạn phải chọn giữa hai lựa chọn này. Bạn có muốn để mất lịch sử của bạn trên tập tin hay không? – tasomaniac

0

Git không thực sự theo dõi đổi tên trực tiếp; nó dựa vào chúng dựa trên các cặp thêm/xóa tệp. Tôi cho rằng ý tưởng đang chạy git add khi đổi tên, trong khi Android Studio chỉ xóa các tệp cũ. Hãy thử chạy git add chính bạn trên các tệp mới và một git rm trên các tệp cũ và Git sẽ hiển thị chúng dưới dạng đổi tên.

+0

Thực ra tôi không thể kiểm soát tất cả điều này một cách thủ công. Tôi chỉ sử dụng lệnh chuẩn "Chuyển đổi tập tin java thành tập tin kotlin" Vì kết quả là tôi đã xóa tập tin cũ và tạo tập tin mới (đã được thêm vào git). Tôi đoán là IDE không sử dụng lệnh mv hoặc git mv. Vì vậy, tôi thấy đã tổ chức cho hai tệp: đã xóa Sample.java và thêm Sample.kt. Điều duy nhất tôi có thể làm để lưu lịch sử là đảo ngược Sample.java và lưu nội dung của Sample.kt vào Sample.java. Sau đó xóa Sample.kt và đổi tên Sample.java thành Sample.kt. Đó là một nỗi đau! –

+0

Git không có khái niệm nội bộ về đổi tên. Nếu bạn xóa một tệp và thêm một tệp khác có cùng nội dung, nó sẽ xác định một cách heuristically rằng đó là một sự đổi tên. Bạn không thể nói rằng đó là một sự đổi tên.Nghe có vẻ như tôi đang xem một cam kết tiềm năng từ một số giao diện mà không xác định được sự đổi tên về mặt heuristically. Bạn có thể gõ 'git status' trước và sau khi sao chép/đổi tên các bước mà bạn làm? Tình trạng trước và sau sẽ giống nhau. – adzenith

0

Như đã đề cập trong các câu trả lời khác, git theo dõi nội dung của tệp chứ không phải đổi tên. Khi git log được chạy với tùy chọn --follow, nó hiển thị lịch sử ngoài đổi tên, tuy nhiên nó chỉ xem xét một tệp nếu nội dung tệp trước đó và hiện tại có chỉ số tương tự 50% trở lên, tức là ít hơn một nửa dòng tệp đã thay đổi.

Đối với trường hợp này, nơi mà hầu hết các dòng đã thay đổi, bạn có thể đặt một thanh thấp hơn đối với các chỉ số tương đồng sử dụng -M tùy chọn:

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

Tùy theo trường hợp, bạn có thể cần phải đi thậm chí thấp hơn hơn 20%.

Các vấn đề liên quan