在你通過github或者其他遠程托管服務器來和其他人進行協(xié)同開發(fā)代碼的時候弛针,確保換行符被正確處理是一項很重要的事统抬。首先冀宴,你需要知道不同的操作系統(tǒng)對換行符的定義會有所不同灭贷,Unix或類Unix操作系統(tǒng)的換行符叫做LF,而windows系統(tǒng)的叫做CRLF略贮,二者具有很大的區(qū)別:
Unix系統(tǒng)里甚疟,每行結尾只有“<換行>”,即"n"逃延;Windows系統(tǒng)里面览妖,每行結尾是“<換行><回車>”
Note:引自回車(CR)與換行(LF), 'r'和'n'的區(qū)別.
這就是造成問題的根源——即如果你使用的是windows系統(tǒng)真友,而你的小伙伴用的是Mac的話黄痪,當你們使用git協(xié)同開發(fā)軟件時,就會出現換行符不統(tǒng)一的問題盔然。
git其實可以自己處理換行符不統(tǒng)一的問題桅打,但是可能會產生意想不到的結果。因此愈案,有必要進行相關的配置挺尾,我們通常有兩種方案:
- 全局配置換行符
- 針對某個倉庫的局部配置
換行符的全局配置
一般如果你不想麻煩的話,可以采用比較簡單的方法站绪,如下所示:
$ git config --global core.autocrlf true
其實遭铺,在你安裝windows版本的git或者torgoiseGit時,你可能已經進行過這樣的配置恢准,也許你當時并未知道那個選項是什么意思魂挂。下面這張圖是不是有些眼熟呢?
Note:本圖片來自百度經驗:http://jingyan.baidu.com/article/9f7e7ec0b17cac6f2815548d.html馁筐。
不過涂召,也許很多人安裝git的時候,是一直next...next吧敏沉!其實上面寫得很清楚:
- Checkout Windows-style, commit Unix-style line endings
當檢出文本文件時果正,Git會將LF轉換為CRLF。當提交文本文件時盟迟,CRLF將會被轉換為LF秋泳。對于跨平臺的項目,這是對Windows系統(tǒng)的推薦設置攒菠。("core.autocrlf" is set to "true")
- Checkout as-is, commit Unix-style line endings
當檢出文本文件時迫皱,Git不會做任何轉換。當提交文本文件時辖众,CRLF將會被轉換為LF卓起。對于跨平臺的項目,這是對Unix系統(tǒng)的推薦設置赵辕。("core.autocrlf" is set to "input")
- Checkout as-is, commit as-is
不論是檢出還是提交文本文件時既绩,Git都不會做任何轉換。對于跨平臺的項目还惠,不推薦采用該選項饲握。
顯然,第一個選項就是我們所介紹的第一種方法蚕键。
順便吐槽一下救欧,我在網上看到很多介紹如何安裝Git的博客,很少有詳細說明每一個安裝步驟的锣光,有些甚至直接說
一直next下去就安裝完成了笆怠。
一方面原因就是他們也不知道,其實這樣可能會對新手產生誤導誊爹,而且未免有些不負責任蹬刷。
單一倉庫的換行符局部配置
當然瓢捉,有更好的方法解決換行符不統(tǒng)一的問題——使用.gitattributes
文件統(tǒng)一換行符。這種方法是針對某個倉庫進行換行符的統(tǒng)一配置办成,即時你已經進行了全局配置泡态。
另外,這個文件有點兒類似于.gitignore
迂卢,不僅名字很類似某弦,使用方式,編寫語法也很像而克。這個文件必須位于倉庫的根目錄靶壮,可以像其他文件一樣進行修改、提交员萍。下面介紹如何編寫這個文件:
文件內容看起來像一張表格腾降,總共分為兩列:左邊一列是git要匹配的文件名;右邊是git需要采用的換行符格式充活。下面我們來看一個栗子:
# Set the default behavior, in case people don't have core.autocrlf set.
* text=auto
# Explicitly declare text files you want to always be normalized and converted
# to native line endings on checkout.
*.c text
*.h text
# Declare files that will always have CRLF line endings on checkout.
*.sln text eol=crlf
# Denote all files that are truly binary and should not be modified.
*.png binary
*.jpg binary
如果你熟悉.gitignore
的話蜂莉,你會覺得上面這個文件的左邊一列很熟悉,這里我們就不再贅述了混卵,不熟悉的話映穗,請自行查閱相關資料。唯一的不同就是.gitattributes
文件多了右邊一列幕随,如text
, text eol=crlf
, binary
蚁滋,剛剛我們也說過這一列是用來設置左邊對應文件使用的換行符格式的,左右兩列用空格隔開赘淮。下面我們來詳細介紹下右邊一列的語法:
text=auto
讓git自行處理左邊匹配的文件使用何種換行符格式辕录,這是默認選項。text eol=crlf
對左邊匹配的文件統(tǒng)一使用CRLF換行符格式梢卸,如果有文件中出現LF將會轉換成CRLF走诞。text eol=lf
對左邊匹配的文件統(tǒng)一使用LF換行符格式,如果有文件中出現CRLF將會轉換成LF蛤高。binary
告訴git這不是文本文件蚣旱,不應該對其中的換行符進行改變。另外戴陡,binary
和符號-text -diff
是等價的塞绿。
上面這些語法應該已經足夠了,如果有興趣的恤批,可以自行查閱相關資料异吻,比如官方的資料:https://git-scm.com/book/en/v2/Customizing-Git-Git-Attributes。
如果創(chuàng)建倉庫之前沒有進行換行符配置怎么辦
也許你在看完我的博客之后喜庞,才意識到自己并未進行相關的設置抑或是你想修改換行符配置诀浪,于是你興致勃勃地按照我的博客進行了配置棋返,結果你發(fā)現出了一堆莫名其妙的警告或者錯誤。
怪我嘍笋妥?
不要著急吐槽窄潭,兵來將擋春宣,水來土掩,沒有解決不了的問題嫉你!
- 首先保存Git中目前的所有文件月帝,這樣可以確保你的工作不會丟失。
# 在倉庫的根目錄下運行命令
$ git add . -u
$ git commit -m "Saving files before refreshing line endings"
- 然后刪除暫存區(qū)中的所有文件幽污,
$ git rm --cached -r .
- 重寫暫存區(qū)以重新應用新的換行符
$ git reset --hard
- 找回所有修改過的文件并加入暫存區(qū)嚷辅,同時,你也可以查看些文件沒有被修改距误。
$ git add .
# 出現"warning: CRLF will be replaced by LF in file."的警告是很正常的現象
- 提交你對倉庫的修改
$ git commit -m "Normalize all the line endings"
參考資料
Github help文檔:Dealing with line endings
Stackoverflow.com:Trying to fix line-endings with git filter-branch, but having no luck
注:本文遷移自我的CSDN博客:https://blog.csdn.net/github_30605157/article/details/56680990
簸搞。