最近工做使用 sourceTree
的時候常常發現,儘管只是很小的代碼改動,可是在文件 diff 的區域莫名的多了不少空格,即便選擇忽略空格,一項項提交仍有很大概率報錯,非常煩惱。最初的想法是經過腳本去除掉空格,但通過一番努力依然沒有完全解決問題。java
偶然的,經過對同事提交的文件使用命令行執行diff的時候,發現存在大量的 ^M
符號,考慮到同事使用的是 windows 系統,終於意識到頗有多是換行符的問題。通過排查終於發如今 sublime 中設置了 line Endings 爲 windows (CRLF),而做爲主力開發的 IDEA 設置爲 LF。最終致使了項目換行符混亂。剩餘內容爲着力於解決問題。git
首先在不一樣操做系統中,換行符並不統一,Linux 系統中使用 0x0A(LF)
, windows 系統中使用 0x0D0A(CRLF)
, 而 MAC OS 系統起初使用0x0D(CR)
後來和 Linux 系統保持一致。而 git 默認採用 Linux 的換行符(固然這一點並不奇怪)。windows
git 爲了解決不一樣平臺換行符不一致的問題,在 windows 操做系統中默認在檢出代碼時將 LF 轉換爲 CRLF,而在提交的時候再轉換爲 LF,可是看似完美的解決方案在中文環境中卻失效了。bash
git 中有三個參數於換行符有關:編輯器
eol
: 設置工做目錄中文件的換行符,有三個值 lf, crlf 和 native(默認,同操做系統)autocrlf
:
true
表示檢出是轉換CRLF, 提交時轉換爲 LFinput
表示檢出是不轉換,提交時轉換爲 LFfalse
表示不作轉換safecrlf
:
true
表示不容許提交時包含不一樣換行符warn
則只在有不一樣換行符時警告false
則容許提價時有不一樣換行符存在配置方法:工具
<!--統一換行符爲 lf-->
git config --global core.eol lf
<!--將自動轉換關閉,避免轉換失敗不能不一樣進行提交-->
git config --global core.autocrlf false
<!--禁止混用 lf 和 crlf 兩種換行符-->
git config --global core.safecrlf true
複製代碼
雖然經過設置了 git 全局參數解決了問題,可是做爲團隊協做的話,並不能保證全部人都正確配好了。git 提供了.gitattributes文件解決了這個問題。在項目根目錄新建.gitattributes文件,添加一下內容:ui
# Set the default behavior, in case people don't have core.autocrlf set.
* text eol=lf
複製代碼
經過這種方式避免有人沒有設置 core.autocrlf 參數,而且將該文件加入版本控制中。spa
另外根據須要 .gitattributes 文件能夠在項目不一樣目錄中建立,而一些非文本文件能夠設置爲二進制文件,不用考慮換行符問題。操作系統
對於項目已有內容如何進行轉換呢,推薦使用dos2unix
工具,在mac中能夠很方便的使用brew安裝,而windows系統中git bash也自帶了該工具。 以轉換項目中 java 源代碼爲例:命令行
cd <project_path>
find . -type file -name '*.java' -exec dos2unix {} +
複製代碼
最後使用編輯器的時候也確保換行符設置正確