Linux 下 Git 換行符一致性設定全攻略

12 分鐘閱讀

琳 avatar

我使用 Fedora 系統,和其它使用 Windows 的開源社群的人一起寫專案。我沒有辦法規範其它的人,我們的 git repo 中有 CRLF 也有 LF。我希望我在 git checkout 時全部轉換為 LF,並且在我 git commit 時按照現有的狀況(或者轉為 LF 加入)。我要如何設定我的 git config 設定?

Felo Search avatar
Felo Search

本報告旨在提供在 Fedora (Linux) 系統上設定 Git 的詳細指南,以確保在與使用 Windows 的開發者協作時,處理混雜 CRLF 與 LF 換行符的儲存庫(repository)能夠滿足特定需求:於 git checkout 時將所有文字檔案轉換為 LF 換行符,並在 git commit 時,將工作目錄中的 LF 換行符提交至儲存庫,或確保儲存庫中的檔案最終為 LF 換行符。核心解決方案是透過專案根目錄下的 .gitattributes 檔案來強制執行換行符規則,輔以適當的本地 Git 全域設定。

換行符問題背景

不同的作業系統使用不同的字元來標記文字檔案的換行:

當不同作業系統的使用者在同一個 Git 儲存庫上協作時,若未妥善處理,換行符的差異會導致 Git 將整個檔案標記為已修改,即使內容本身沒有變更,這會干擾程式碼比對 (diff) 和審查 (review) 1567

Git 處理換行符的機制

Git 提供數種機制來處理換行符轉換:

1. core.autocrlf 全域或本地設定 此設定決定 Git 在提交 (commit) 和檢出 (checkout) 時是否自動轉換換行符 89

2. .gitattributes 檔案 這是在儲存庫層級定義檔案屬性的方法,其設定會覆寫使用者的 core.autocrlf 設定,是確保團隊一致性的最可靠方式 81617181920

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

步驟 2: 設定使用者的本地 Git 全域組態 (Fedora/Linux 建議)

雖然 .gitattributes 優先級更高 81718,但設定好本地全域組態仍是良好習慣。

# 設定提交時將 CRLF 轉換為 LF,checkout 時不轉換 (Linux/macOS 推薦值)
git config --global core.autocrlf input

# 建議開啟:拒絕提交包含混合換行符的檔案
git config --global core.safecrlf true

步驟 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.autocrlfinput,並將 core.safecrlf 設為 true,以提供額外的保障。最後,務必執行 git add --renormalize . 來更新現有儲存庫,使新設定生效。這種方法不需要規範 Windows 使用者的設定,即可在 Fedora 環境下達到預期的換行符處理效果。

我最後使用

[core]
    autocrlf = input
    safecrlf = warn
  1. git换行符导致的提交整个文件的解决方案 - CSDN博客 ↩2 ↩3 ↩4 ↩5 ↩6

  2. 代码提交Git时CRLF与LF转换原创 - CSDN博客 ↩2

  3. 代码提交Git时CRLF与LF转换原创 - CSDN博客

  4. Git中CRLF与LF的转换 - CSDN博客

  5. Confused about how to handle line endings in git repo

  6. 8.1.3. 换行符问题— GotGit

  7. Git 多平台换行符问题(LF or CRLF) - 旷世的忧伤

  8. Configuring Git to handle line endings - GitHub Docs ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9 ↩10 ↩11 ↩12

  9. 配置 Git 处理行结束符 - GitHub 文档 ↩2 ↩3 ↩4 ↩5

  10. 在git中自动把CRLF转换到LF的方法原创 - CSDN博客

  11. git 乱改你的换行符?一句话设置让git 不再碰你某个文件的换行符 ↩2

  12. 【Git】Git行结束符CRLF、LF自动转换全局 - 博客园 ↩2 ↩3

  13. Git因换行符不一致导致反复有修改记录- !win - 博客园 ↩2 ↩3 ↩4

  14. Git 自动转换文件换行符 - 狂飙 ↩2 ↩3

  15. Git 多平台换行符问题(LF or CRLF) - 旷世的忧伤 ↩2 ↩3 ↩4 ↩5 ↩6

  16. Git在Windows下自动转换换行符LF CRLF 的解决方案原创 ↩2 ↩3

  17. Git and normalization of line-endings - DEV Community ↩2 ↩3 ↩4

  18. 配置Git 处理行结束符- GitHub 文档 ↩2

  19. 配置Git 处理行结束符- GitHub 文档

  20. Git tip: Add a .gitattributes file to deal with line endings

  21. CRLF vs. LF: Normalizing Line Endings in Git

  22. Configuring Git to handle line endings - GitHub Docs ↩2

  23. How to handle line endings in git - CodeAndWeb ↩2 ↩3

  24. Azure DevOps Server (TFS)中代码文件换行问题解决方案(Git)

  25. Forces all line endings to LF in your git repo. - GitHub Gist ↩2 ↩3

  26. Is there any way to 100% enforce certain line endings ... - Reddit

  27. Mind the End of Your Line - Adaptive Patchwork

  28. LF will be replaced by CRLF”最详细解释+解决方案 - 知乎专栏

  29. git: How do I get rid of "warning: CRLF will be replaced by LF ...

  30. What does "!eol" in gitattributes do? - Stack Overflow

  31. gitattributes Documentation - Git

  32. Git Handles Carriage Returns Differently When Committed ...