1.換行符在不同的操作系統上的表示
首先要理解的一點是,對於不同的操作系統,對於換行符的表示是不一樣的。也就是說當我們在編輯一個文件,在鍵盤上按下回車鍵的時候,對於不同的操作系統保存到文件中的換行符是不一樣的。見下表:
CR:表示回車\r
LF:表示換行\n
CRLF:表示回車換行\r\n
敲下回車鍵,不同的操作系統保存到文件中的值:
Windows:使用的是CRLF ==> 即\r\n,文件中保存的是\r\n
Linux/Unix: 使用的是LF ==> 即\n,文件中保存的是\n
Mac OS: 使用的是CR ==> 即\r,文件中保存的是\r
Mac OS X系統:使用的是LF ==> 即\n,文件中保存的是\n(Mac OS X已經改成和Unix/Linx一樣使用LF)
問題: 既然不同的操作系統,對於換行符使用不同的表示形式,如果一個團隊在開發一個共同的項目,如果你使用的是windows系統,而你的小伙伴用的是Mac的話,當你們使用git協同開發軟件時,就會出現換行符不統一的問題。
雖然對於不同的操作系統,默認的換行符的表示方法不一樣,但是編輯器是可以設置在敲下回車鍵的時候保存的換行符是什么的,比如常用的vscode就可以進行設置。直接點擊編輯器右下角的LF或者CRLF,出現如下圖所示的設置,直接選擇即可。在設置完成之后,在敲回車鍵,保存在文件中的換行符就是你設置的(CRLF或者是LF,設置什么就是什么)。
2.Git會自動對換行符進行轉換
Git為了解決上面提出的問題,會自動對換行符進行轉換。轉換的方案有3種:
- 在提交時將CRLF轉換為LF,在拉取(檢出checkout)時將UNIX換行符(LF)替換成CRLF。(Windows系統推薦使用,我們在windows上安裝git的時候,如果一路next,默認是使用這個方案)
- 在提交時將CRLF轉換為LF,在拉取(檢出checkout)時不進行轉換。(Linux/Unix和Mac OS和Mac OS X推薦使用,在Unix或者類Unix操作系統上安裝git,默認使用這種方案)
- 不進行轉換(這種方案對於跨平台項目不推薦使用)。
可以發現,如果不使用第3種方案,那么在Git倉庫(包括本地倉庫和GitHub遠程倉庫)中保存的文件的換行符都是LF表示的。
3.自己指定換行符轉換方案
我們自己在開發過程中,是可以修改/設置Git的換行符轉換方案的。修改/設置的方法有2種。
3.1 通過Git的全局配置進行修改
設置autoclf屬性,在控制台直接運行如下的一條命令就可以設置了:
// 提交時轉換為LF,檢出時轉換為CRLF
git config --global core.autocrlf true
// 提交時轉換為LF,檢出時不轉換
git config --global core.autocrlf input
// 提交檢出均不轉換
git config --global core.autocrlf false
上述命令運行之后,會修改.gitconfig文件。
一般在項目中,為了避免項目中同時出現CRLF和LF,還可以開啟safecrlf檢查。當然,如果你的項目自己定義了語法檢查規則,例如使用eslint去約束換行符必須是LF,那么當你的文件中出現CRLF的時候,eslint會給你錯誤提示信息,告訴你不能包含CRLF,這時候,不開啟safecrlf也是可以的 (一般建議開啟)。
開啟方法如下第一條命令:
// 拒絕提交包含混合換行符的文件 (一般設置為true)
git config --global core.safecrlf true
// 允許提交包含混合換行符的文件
git config --global core.safecrlf false
// 提交包含混合換行符的文件時給出警告
git config --global core.safecrlf warn
上述命令運行之后,也會修改.gitconfig文件。
3.2 通過.gitattributes進行修改
參考:https://git-scm.com/docs/gitattributes
注意.gitattributes是針對一個單一的倉庫的,也就是說每一個代碼倉庫都可以包含一個.gitattributes文件。這種方式設置之后,不需要一個項目組里面的同事分別再去修改自己電腦的git的全局配置。
對於通過.gitattributes設置換行符的轉換方案,可以使用如下的命令:
1. text=auto:采用git認為最好的方式來處理文件,未在.gitattributes中
設置的項默認按照這種方式處理;(If Git decides that the content
is text, its line endings are converted to LF on checkin.
When the file has been committed with CRLF, no conversion
is done.)git發現是文本文件,那么在checkin的時候,會將文件結尾符轉
換為LF。果文件已經被已CRLF的形式提交(就是說已經在Gti倉庫中的文件,如
果結束符是CRLF,不會有任何的轉換),不會有任何轉換。
2. -text 表示讓git在checkin以及checkout的時候,對end-of-line不
做任何轉換。
3. text 表示在checkin的時候會被轉換為LF(在repository中的文件結束
符是LF),如果需要控制在checkout的時候的換行符,需要結合eol進行設置
(也就是 控制working tree中的文件的結尾符,需要通過eol設置)。
text=auto和text的區別在於,text=auto由git來確定是不是文本文件,
從而進行轉換;而text表示,你確定這個path就是文本文件,會直接對這個
path進行轉換,而不是有git來decides是否轉換。
4. 如果沒有指定text,git會使用全局配置中的core.autocrlf來進行eol
的轉換。core.autocrlf需要自己在自己的電腦上進行配置。
5. eol=crlf:對左邊匹配的文件統一使用CRLF換行符格式,如果有文件中出現LF將會轉換成CRLF;也就是說,在checkin和checkout的時候,文件中都是CRLF,
LF會被轉換為CRLF。
7. eol=lf:對左邊匹配的文件統一使用LF換行符格式,如果有文件中出現CRLF將會轉換成LF;也就是說,在checkin和checkout的時候,文件中都是LF,
CRLF會被轉換為LF。
8. binary: 告訴git該文件為二進制,防止git修改該文件。git不會對對其中的換行符進行改變。
注意:.gitattributes文件必須要提交之后才能生效。
參考博客: