將檔案的行結束符由 CRLF 轉換為 LF

Undefined443發表於2024-03-17

當我們使用 Unix-like 系統時,有時行結束符 CRLF 會給我們造成不便。比如說如果我們拿別人在 Windows 上編輯的配置檔案用於我們的 Unix-like 系統上的程式時,可能會由於程式無法識別 CR 而導致錯誤。

比如說,我曾經使用行結束符為 CRLF 的 vim 配置檔案用於我的 macOS 上的 vim,結果開啟 vim 時會出現這樣的錯誤提示:

Error detected while processing /Users/xiao/.vimrc[14]../Users/user/.vim/pack/themes/start/dracula_pro/colors/dracula_pro.vim:
line    2:
E492: Not an editor command: ^M

在這種情況下,錯誤的來源是 ^M 字元,這是一個回車符(Carriage Return, CR)。在 Windows 系統中,行尾標記通常為 CRLF(即 \r\n),而在 Unix 和 Linux 系統,包括 macOS 在內,行尾標記只有一個 LF(即 \n)。

因此,你需要將檔案的行結束符由 CRLF 轉換為 LF。

解決方法:

  1. 如果你需要轉換的檔案有很多,你可以藉助 git 的自動轉換行結束符功能:

    git init && git add . && git commit -m "tmp"  # 建立儲存庫並提交所有檔案
    git config core.autocrlf input  # 提交到儲存庫時轉換為 LF
    git rm --cached -r .  # 刪除 git 中的快取檔案
    git reset --hard  # 重置專案檔案
    

    現在所有包含 CRLF 的檔案都將被轉換為 LF。

  2. 如果你只需要轉換一兩個檔案,可以使用 dos2unix 工具:

    dos2unix <CRLF_file>
    

    CRLF_file 替換為你要轉換的檔名。

參考:Converting the End of Line Sequence from CRLF to LF in any of your project files | GitHub

關於 autocrlf 配置的說明:

  • true:提交到儲存庫時使用 LF,檢出時使用 CRLF;
  • input:提交到儲存庫時使用 LF,檢出時不轉換(還是 LF);
  • false不進行任何轉換(如果原來是 CRLF,那麼提交到儲存庫時還是 CRLF,檢出時也還是 CRLF)(並不是這樣,在 macOS 上操作時效果感覺和 input 一樣)

git core.autocrlf 配置說明

相關文章