Mac 上檔名相同、大小寫不同的資料夾會合併成一個所導致的問題

KSIG發表於2018-12-18

我的表達邏輯還是不太好,可能會講的有點繞。
但是仔細看完肯定會有收穫的!

之前實習的時候在寫完程式碼上線部署的時候發現伺服器 Build 的時候找不到依賴檔案,但是在本地 Build 卻正常,檢查了半天本地明明沒有問題,但是伺服器上就是報路徑錯誤,讓我很是頭疼。

最後在大佬幫助 Debug 後發現伺服器上面有兩個同名資料夾(大小寫不同)。例如:ABCabc 兩個資料夾,因為伺服器是 Linux 系統,而 Linux 系統是區分大小寫的,所以兩個檔案可以同時存在,但是在拉到本地之後,就合併成了一個資料夾 ABC (因為 Windows 和 macOS(預設) 以及 Git(預設) 是不區分大小寫的),這個時候 abc 資料夾在本地是看不見的,合併到了 ABC 資料夾中。

因為本地 abc 資料夾中的所有檔案都在 ABC 資料夾中,所以程式碼中所有的依賴路徑都是 ../ABC/.. ,這個時候在本地跑是沒有問題的。

但是在伺服器上面,其實依賴的檔案有一部分是存在 abc 中的。因為路徑都是指向 ABC ,而 ABC 檔案中並沒有這些檔案(檔案在 abc 中),這個時候就會報路徑錯誤。

這樣的錯誤是如何產生的?

發生這樣的問題我也是很好奇,於是我翻到了這個資料夾當時的 commit 記錄,發現當時是兩個人一起來開發一個任務,於是大家一起商量好的資料夾的名稱,卻因為沒有規範名稱的大小寫所以出現了問題。

例如 A 建立了 ABC 然後程式碼裡的依賴路徑為 ../ABC/..,B 建立了 abc,依賴路徑為 ../abc/..。因為上傳到服務端之後資料夾都是會存在的,並不會合併,所以對於當時的情況來說,並不會發生路徑錯誤。so,這個坑就這樣產生了。

這個錯誤引發的問題

這個坑對於以後的開發人員來說就說一個很大的坑了,不,應該說是巨坑、天坑!

*這一段可能會很繞,仔細看:*因為程式碼再 pull 到本地之後,兩個資料夾就會合併成一個,比如這個時候合併成了 ABC ,那麼這個時候依賴 ../abc/.. 的功能就爆炸了,這個時候 Debug 就發現,咦,這裡怎麼會有依賴 ../abc/.. 的路徑,怪不得會有問題,趕緊改成 ../ABC/..,嗯,這個時候程式碼 OK 了,可以跑起來了。**但是!**當程式碼再次 push 到了伺服器上的時候,問題又來了,因為依賴 abc 資料夾的程式碼被改成了 ../ABC/.. 啊,但是檔案其實還是在 abc 中的啊,所以伺服器上的程式碼又爆炸了。

這個時候接手程式碼人的內心:wtf???讓我死不好嗎。

解決的方法

把伺服器上的兩個資料夾先刪掉一個,然後重新上傳一下程式碼,確保只有一個資料夾。

如何避免這樣的問題:

  1. 確定好檔名的規範,比如使用駝峰,或者全部小寫等等
  2. 兩個分支同時建立資料夾的時候名字大小寫不要搞錯了,不然合併的時候就是兩個資料夾

擴充

Git 為什麼是預設不區分大小寫?

其實根據上面的一些分析,我覺得有一定原因是為了相容 Widnows 和 macOS 的,因為這兩個系統預設是不區分大小寫的。

即使 Git 支援了區分大小寫,可以有兩個大小寫不同但是名稱相同的資料夾,但是 Windows 和 macOS 不能顯示,那豈不是很尷尬。

相關文章