最近在Windows上使用Git碰到Java Class名稱大小寫不一致的問題。
Java的Class名稱必須與檔案名稱完全一致(包含大小寫),否則會編譯錯誤。然而Windows檔案系統是大小寫不敏感的(case insensitive),也就是ABC.java與AbC.java在檔案系統中被視為相同的檔案;而Git則是大小寫敏感(case sensitive)。
因此當只修改檔案名稱的大小寫時,會產生Git與作業系統不一致的情況。例如在VS Code中的Java class檔案上按F2將AbC.java重新命名為ABC.java,Git會無法辨識這種異動,此時儘管Windows檔案系統中確實顯示ABC.java,但commit時卻仍是AbC.java,這是因為在大小寫不敏感的檔案系統上,檔名大小寫變更不被視為rename,Git index因此不會更新檔案路徑。因此必須用git mv來解決。
在經過以上更動後,也就是已修改了Class檔案名稱、Class名稱與相關引用與依賴都改為ABC.java後,先執行git mv AbC.java _tmp_AbC.java把舊的檔案重新命名為臨時檔名並commit;然後再執行git mv _tmp_AbC.java ABC.java將臨時檔名改為新的正確檔名並commit。如此Git才會更新到正確的檔名ABC.java。
透過中繼檔名,能強制檔案系統實際rename,使Git正確記錄大小寫變更,最終使repo中的java檔名與Class名稱有一致的大小寫。
解決步驟
- 修改Class檔案名稱,e.g.
AbC.java→ABC.java - 修改Class名稱與檔案名稱相同
- 修改引用與依賴為新的Class名稱
- 使用
git mv把Class檔案名稱改為中繼名稱並commit。 - 使用
git mv把Class檔案中繼名稱改為新的正確檔名並commit。
沒有留言:
張貼留言