問題復(fù)現(xiàn):
- 操作系統(tǒng):win10惦界;開發(fā)工具:idea2018.3
-
在idea中,打開terminal,使用git add指令將一個.xml文件從工作區(qū)加入暫存區(qū)時,出現(xiàn)警告
批注 2020-02-27 114342.png
問題分析
對該警告信息進(jìn)行搜索基矮,發(fā)現(xiàn)這是一個關(guān)于不同平臺下?lián)Q行符的存儲形式不同的問題。
首先要知道什么是CR什么是LF修壕,CR(carriage-return character)指的是回車符愈捅,而LF(linefeed character)指的是換行符。Windows系統(tǒng)中慈鸠,默認(rèn)使用CR+LF存儲文件中的換行,而在Linux系統(tǒng)中灌具,默認(rèn)使用LF保存文件中的換行青团,老式mac系統(tǒng)中使用CR保存文件中的換行。這就會導(dǎo)致咖楣,windows中打開linux中編寫的文件時督笆,可能會發(fā)現(xiàn)全文沒有換行整個是一行,而在Linux中打開Windows中編寫的文件時诱贿,可能會發(fā)現(xiàn)每一行末尾多一個符號娃肿。
-
在git版本庫中默認(rèn)使用LF保存換行信息,而在idea工作區(qū)中珠十,文件換行信息以何種形式保存料扰,默認(rèn)取決于idea所處的操作系統(tǒng)類型的,如下圖所示
批注 2020-02-27 114342.png 其次還要知道core.autocrlf/core.safecrlf/core.eol的有關(guān)概念焙蹭,可參考https://xiaozhuanlan.com/topic/4053786912中的介紹
-
core.autocrlf有三種可取的值:
-
$ git config --global core.autocrlf true
:在windows系統(tǒng)中晒杈,應(yīng)該把這個值設(shè)置為true,這樣在checkout代碼的時候(從版本庫到工作區(qū))孔厉,LF會被轉(zhuǎn)換成CRLF拯钻,這樣版本庫中以LF表示的換行才能在Windows中正常顯式∽颍總結(jié)一下粪般,這種設(shè)置比較適合windows平臺下的Git。 -
$ git config --global core.autocrlf input
:在Linux平臺下污桦,checkout(從版本庫到工作區(qū))時也就不需要進(jìn)行轉(zhuǎn)換了(因?yàn)間it默認(rèn)使用LF換行)亩歹。但是如果Linux平臺下,引入了一個CRLF換行的文件,那就應(yīng)該將此處置為input捆憎,這樣Git在提交時會將CRLF轉(zhuǎn)換為LF舅柜,checkout時就不再將LF轉(zhuǎn)換為CRLF(這樣一轉(zhuǎn)換在Linux平臺上反而無法識別換行)《愣瑁總結(jié)一下致份,這種設(shè)置比較適合linux平臺下的Git。 -
$ git config --global core.autocrlf false
:如果十分確定自己在當(dāng)前Windows平臺編寫的文件不會在其他平臺被打開础拨,可以將此處置為false氮块,將CRLF保留在版本庫中。
-
-
core.eol也有三種可能的取值
- lf:lf換行
- crlf:crlf換行
- native:這個值默認(rèn)為native诡宗,native表示跟隨操作系統(tǒng)默認(rèn)配置
當(dāng)core.autocrlf為true或者input時滔蝉,算是激活了eol,此時若core.safecrlf為true塔沃,Git會檢查crlf轉(zhuǎn)換是否正常蝠引,對于Windows平臺蛀柴,將core.autocrlf設(shè)置為true螃概,則Git會認(rèn)為工作區(qū)的文件都應(yīng)該是以CRLF換行的,那git add一個LF換行的文件鸽疾,就會報(bào)出本文開頭提示的warning冒窍。
但是如果按照這個邏輯的話届良,在我的windows環(huán)境下士葫,idea中的這個xml文件的換行信息與windwos系統(tǒng)保持一致爪模,git add操作不應(yīng)該引起這樣的warning应狱。故又查詢了xml語法規(guī)范尉咕,xml文件以LF保存換行!
問題成因
- xml文件使用LF保存換行
- 在windows環(huán)境中璃岳,core.autocrlf設(shè)置為了true年缎,core.safecrlf也為true,這會讓Git認(rèn)為工作區(qū)文件都應(yīng)該使用CRLF換行铃慷。
- 那么在Windows中g(shù)it add一個LF換行的文件的話晦款,Git認(rèn)為出現(xiàn)了換行符號混用的問題,就會報(bào)出這樣的警告枚冗,提示使用者LF會被轉(zhuǎn)換為CRLF,但是仔細(xì)觀察上圖警告信息可以發(fā)現(xiàn)蛇损,Git所修改的只是暫存區(qū)xml文件的換行符號赁温,工作區(qū)的文件換行符號不做任何改動。
問題解決
- 關(guān)閉自動轉(zhuǎn)換淤齐,在上述圖片中的設(shè)置界面股囊,修改idea設(shè)置,將工作區(qū)全部文件以LF換行更啄,這樣可以與Git版本庫保持一致稚疹,無需使用任何轉(zhuǎn)換。
但是祭务,這種方法不夠安全内狗,稍不注意,從windows系統(tǒng)向工作區(qū)導(dǎo)入CRLF換行的文件义锥,就容易引起換行符混亂柳沙。并且還有可能影響diff指令的使用。git config --global core.safecrlf false
- 使用.gitattributes文件來明確工作區(qū)中不同類型文件的轉(zhuǎn)換配置拌倍,
git config --global core.safecrlf true #windows平臺下 git config --global core.autocrlf true #Linux平臺下 git config --global core.autocrlf input #在.gitaatributes文件中 *.sh text eol=lf # 控制行尾規(guī)范性赂鲤,入庫時將行尾規(guī)范為LF噪径,出庫時禁止轉(zhuǎn)換為CRLF *.py eol=lf #入庫時將行尾規(guī)范為LF,出庫時禁止轉(zhuǎn)換為CRLF *.xml eol=lf merge=text # 入庫時將行尾規(guī)范為LF数初,出庫時禁止轉(zhuǎn)換為CRLF找爱,當(dāng)作text文件進(jìn)行merge操作