這幾天在開發工具的時候在測試 Windows Cygwin 相容性的時候一直出現錯誤訊息:
/test.conf: 列 5: $'\r' : 命令找不到
我在之前有寫過一篇關於使用 git add 時出現轉換 CRLF to LF 格式的文章,在這邊出現的問題在於 Windows clone or pull 下來 source code 出現的問題
雖然我在之前處理好了 git repository 上面的格式為 LF 格式,但是 git 預設因為想處理好各種終端使用者的需求,所以 pull or clone 會處理成終端使用者的 newline,而 Windows clone 下來就變成了 CRLF … 但是我用 Cygwin 執行會出現換行符號的錯誤!!
要確認是否為換行符號的錯誤可以用 od 這個工具確認,就會看到非常多的 \r\n 符號 !!
$ od -c test.conf 0000000 # ! / b i n / b a s \r \n \r \n # 0000020 P r o g r a m : e m s s e t 0000040 u \r \n # A u t h o r : s h a 0000060 z \r \n # G i t h u b : h t t
這個解決方案在 The Will Will Web 寫的非常詳細,也就是 git text 正規化的問題 (text=auto)
若是你希望終端使用者都不要轉換 newline,可以在專案加入 .gitattributes 宣告,然後重新 commit 正規化一次
$ vim project/.gitattributes * -text $ git commit -m "Normalize all the line endings"
設定 -text 之後就不會再進行 CRLF / LF 之間轉換,如果 repository 是 LF,clone 下來就會是 LF 格式。
附帶一提:
突然想到之前工作常常和大陸同事共事的時候,明明是一樣的 source code,但是從他們那邊複製過來,所有的檔案就會被重新 commit 一次,程式碼明明都一模一樣!!
經過這次釐清才明白,因為大陸同事都是使用 Windows 開發,而我是使用 Mac 開發,而且 repository 都是 LF 格式,當覆蓋了大陸同事的 source code,雖然檔案都一模一樣,但都是 CRLF 格式,所以全部判定為 修改過的檔案 必須重新 commit 進去。
至於為何複製 source code 過來後再 commit,而不是直接開發者直接 commit,原因是大陸的同事不會使用 git ….. very well.
參考資料: