我的表達邏輯還是不太好,可能會講的有點繞。
但是仔細看完肯定會有收穫的!
之前實習的時候在寫完程式碼上線部署的時候發現伺服器 Build 的時候找不到依賴檔案,但是在本地 Build 卻正常,檢查了半天本地明明沒有問題,但是伺服器上就是報路徑錯誤,讓我很是頭疼。
最後在大佬幫助 Debug 後發現伺服器上面有兩個同名資料夾(大小寫不同)。例如:ABC
和 abc
兩個資料夾,因為伺服器是 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???讓我死不好嗎。
解決的方法
把伺服器上的兩個資料夾先刪掉一個,然後重新上傳一下程式碼,確保只有一個資料夾。
如何避免這樣的問題:
- 確定好檔名的規範,比如使用駝峰,或者全部小寫等等
- 兩個分支同時建立資料夾的時候名字大小寫不要搞錯了,不然合併的時候就是兩個資料夾
擴充
Git 為什麼是預設不區分大小寫?
其實根據上面的一些分析,我覺得有一定原因是為了相容 Widnows 和 macOS 的,因為這兩個系統預設是不區分大小寫的。
即使 Git 支援了區分大小寫,可以有兩個大小寫不同但是名稱相同的資料夾,但是 Windows 和 macOS 不能顯示,那豈不是很尷尬。