Git CRLF 設定

Posted by Adam on August 24, 2022
針對 Git 處理換行符號(EOL)的假設,以下是直接的技術校正與實作方案。 ### 邏輯校核與漏洞指出 1. **事實 (Fact)**:Git **無法完全忽略**換行符號。Git 在內部儲存(Blob)時必須決定要存成 LF 還是 CRLF。 2. **邏輯漏洞 (Logical Gap)**:若你的「忽略」是指 `git diff` 不顯示差異,這是可行的;但若是指「讓 Git 不追蹤換行符差異」,這會導致跨平台協作時出現索引(Index)衝突或非預期的檔案變更。 3. **推論 (Inference)**:你真正的需求應是「規範化」(Normalization),確保進入 Repo 的全是 LF,而本地工作目錄根據 OS 自動轉換,從而達成「開發感官上的忽略」。 4. **建議 (Best Practice)**:不要依賴全域配置,應在專案根目錄強制使用 `.gitattributes`。 ### 解決方案:`.gitattributes` 與 Vim 檢查 --- ```bash # 建立專案層級的 git 屬性定義文件 touch .gitattributes # 設定自動處理:文字檔在提交時轉為 LF,簽出時依 OS 決定 echo "* text=auto" > .gitattributes # 強制特定副檔名在任何平台簽出皆為 LF (適用於 Shell Script) echo "*.sh text eol=lf" >> .gitattributes # 重新索引現有檔案以套用新規則 git add --renormalize . # 提交變更並確保所有成員規範統一 git commit -m "build: finalize line ending normalization via .gitattributes" # 針對特定目錄進行換行符重整 git add --renormalize src/main/java/com/legacy/ # 針對特定副檔名進行重整(需注意 Shell 字元轉義) git add --renormalize "*.java" # 針對單一檔案進行重整 git add --renormalize path/to/YourLegacyService.java # 結合 Vim 快速操作:在 Vim 中呼叫外部 Git 指令重整當前編輯檔案 # :!git add --renormalize % ``` --- ### 分散式架構下的運維建議 在分散式系統中,若 CI/CD 運作於 Linux 環境,而開發者在 Windows 環境,未經重整的 CRLF 可能導致 Shell Script 在 Container 啟動時報錯(常見的 `\r` 找不到指令)。 **自動化防禦建議(Git Hook):** 若要防止不符合規範的換行符進入伺服器,建議在 `pre-commit` 階段加入檢查腳本。 ```bash # .git/hooks/pre-commit # 檢查是否有 CRLF 的檔案即將被提交 if git diff --cached --check | grep "trailing whitespace"; then # 發現潛在格式問題時終止提交 exit 1 fi ```