•
Linux 下 Git 換行符一致性設定全攻略
12 分鐘閱讀 •
換行符問題背景
不同的作業系統使用不同的字元來標記文字檔案的換行:
當不同作業系統的使用者在同一個 Git 儲存庫上協作時,若未妥善處理,換行符的差異會導致 Git 將整個檔案標記為已修改,即使內容本身沒有變更,這會干擾程式碼比對 (diff) 和審查 (review) 1567。
Git 處理換行符的機制
Git 提供數種機制來處理換行符轉換:
1. core.autocrlf
全域或本地設定 此設定決定 Git 在提交 (commit) 和檢出 (checkout) 時是否自動轉換換行符 89。
true
: (Windows 建議) 檢出時將 LF 轉為 CRLF,提交時將 CRLF 轉為 LF 10111213。input
: (Linux/macOS 建議) 檢出時不轉換,提交時將 CRLF 轉為 LF 8111213。false
: 檢出與提交時皆不進行任何轉換 1141513。
2. .gitattributes
檔案 這是在儲存庫層級定義檔案屬性的方法,其設定會覆寫使用者的 core.autocrlf
設定,是確保團隊一致性的最可靠方式 81617181920。
text=auto
: Git 自動偵測檔案是否為文字檔。若是,則根據core.autocrlf
或core.eol
進行轉換,預設行為是提交時轉換為 LF 81621。text eol=lf
: 強制 Git 在檢出時將文字檔案的換行符轉換為 LF,無論在哪個作業系統 822923。text eol=crlf
: 強制 Git 在檢出時將文字檔案的換行符轉換為 CRLF 824923。binary
: 將檔案標記為二進位檔,Git 不會對其進行換行符轉換 89。* text=auto eol=lf
: 結合text=auto
和eol=lf
,讓 Git 自動偵測文字檔,並在檢出時強制轉換為 LF 2526。
3. core.eol
設定 指定工作目錄中文字檔案應使用的換行符,選項有 lf
, crlf
, native
(作業系統預設) 141325。通常不建議直接修改此設定,除非有特殊需求 17。
4. core.safecrlf
設定 用於檢查提交的檔案是否包含混合換行符或可能導致不可逆轉換 15。
滿足使用者需求的設定方案
根據使用者需求(Fedora 環境下,checkout 時強制為 LF,commit 時提交 LF),最佳實踐是使用 .gitattributes
檔案來統一儲存庫的行為。
步驟 1: 設定 .gitattributes
檔案
在專案的根目錄下建立或修改 .gitattributes
檔案,加入以下內容:
# 自動偵測文字檔,並在 checkout 時強制使用 LF 換行符
* text=auto eol=lf
*
: 此規則適用於所有檔案。text=auto
: Git 會自動判斷哪些是文字檔,並對其應用換行符規則,而二進位檔則不受影響 81617。eol=lf
: 強制 Git 在git checkout
時,將所有被識別為文字檔的檔案轉換成 LF 換行符 82223。這確保了無論儲存庫中原始的換行符是什麼,使用者在 Fedora 上的工作目錄中看到的都是 LF。- 提交行為: 當檔案被標記為
text
(透過text=auto
或明確指定text
) 時,Git 在提交(git commit
)時會預設將其換行符正規化 (normalize) 為 LF 儲存到儲存庫中 143031。結合eol=lf
確保工作目錄為 LF,這能保證提交的也是 LF。
步驟 2: 設定使用者的本地 Git 全域組態 (Fedora/Linux 建議)
雖然 .gitattributes
優先級更高 81718,但設定好本地全域組態仍是良好習慣。
# 設定提交時將 CRLF 轉換為 LF,checkout 時不轉換 (Linux/macOS 推薦值)
git config --global core.autocrlf input
# 建議開啟:拒絕提交包含混合換行符的檔案
git config --global core.safecrlf true
core.autocrlf input
: 這是 Linux 系統的標準建議值 81232。即使.gitattributes
未涵蓋某些檔案,此設定也能確保在提交時嘗試將 CRLF 轉換為 LF。core.safecrlf true
: 增加一層保護,防止因意外情況(如工具錯誤地引入 CRLF)而提交了包含混合換行符的檔案 115。
步驟 3: 對現有儲存庫進行正規化
在加入或修改 .gitattributes
檔案後,需要執行一次正規化操作,讓 Git 根據新規則重新處理儲存庫中的所有檔案 8925。
# (可選) 先提交當前的工作變更
# git add . -u
# git commit -m "儲存進度,準備正規化換行符"
# 讓 Git 根據 .gitattributes 重新處理索引中的所有檔案
git add --renormalize .
# 查看哪些檔案的換行符被修改了 (可選)
# git status
# 提交正規化後的結果
git commit -m "正規化所有檔案的換行符"
此操作會更新 Git 的索引 (index),確保之後的提交和檢出都符合 .gitattributes
的規範。執行 git add --renormalize .
後,git status
可能會顯示大量檔案被修改,這是正常的,因為 Git 正在統一換行符。
結論
透過在專案根目錄配置 .gitattributes
文件,設定 * text=auto eol=lf
,可以強制 Git 在 checkout
時將所有文字檔轉換為 LF,並在 commit
時將文字檔以 LF 格式儲存於儲存庫中。同時,建議將 Fedora 使用者的本地全域 Git 設定 core.autocrlf
為 input
,並將 core.safecrlf
設為 true
,以提供額外的保障。最後,務必執行 git add --renormalize .
來更新現有儲存庫,使新設定生效。這種方法不需要規範 Windows 使用者的設定,即可在 Fedora 環境下達到預期的換行符處理效果。
我最後使用
[core] autocrlf = input safecrlf = warn
Configuring Git to handle line endings - GitHub Docs ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9 ↩10 ↩11 ↩12
Git and normalization of line-endings - DEV Community ↩ ↩2 ↩3 ↩4
Git tip: Add a .gitattributes file to deal with line endings ↩
Forces all line endings to LF in your git repo. - GitHub Gist ↩ ↩2 ↩3
Is there any way to 100% enforce certain line endings ... - Reddit ↩
git: How do I get rid of "warning: CRLF will be replaced by LF ... ↩
Git Handles Carriage Returns Differently When Committed ... ↩