Git處理換行符問題

在你經過github或者其餘遠程託管服務器來和其餘人進行協同開發代碼的時候,確保換行符被正確處理是一項很重要的事。首先,你須要知道不一樣的操做系統對換行符的定義會有所不一樣,Unix或類Unix操做系統的換行符叫作LF,而windows系統的叫作CRLF,兩者具備很大的區別:html

Unix系統裏,每行結尾只有「<換行>」,即"n";Windows系統裏面,每行結尾是「<換行><回車>」

Note:引自回車(CR)與換行(LF), 'r'和'n'的區別.git

這就是形成問題的根源——即若是你使用的是windows系統,而你的小夥伴用的是Mac的話,當大家使用git協同開發軟件時,就會出現換行符不統一的問題。github

git其實能夠本身處理換行符不統一的問題,可是可能會產生意想不到的結果。所以,有必要進行相關的配置,咱們一般有兩種方案:windows

  • 全局配置換行符
  • 針對某個倉庫的局部配置

換行符的全局配置

通常若是你不想麻煩的話,能夠採用比較簡單的方法,以下所示:服務器

$ git config --global core.autocrlf true

其實,在你安裝windows版本的git或者torgoiseGit時,你可能已經進行過這樣的配置,也許你當時並未知道那個選項是什麼意思。下面這張圖是否是有些眼熟呢?spa

config-newline

Note:本圖片來自百度經驗:http://jingyan.baidu.com/arti...操作系統

不過,也許不少人安裝git的時候,是一直next...next吧!其實上面寫得很清楚:code

  • Checkout Windows-style, commit Unix-style line endings

當檢出文本文件時,Git會將LF轉換爲CRLF。當提交文本文件時,CRLF將會被轉換爲LF。對於跨平臺的項目,這是對Windows系統的推薦設置。("core.autocrlf" is set to "true")orm

  • Checkout as-is, commit Unix-style line endings

當檢出文本文件時,Git不會作任何轉換。當提交文本文件時,CRLF將會被轉換爲LF。對於跨平臺的項目,這是對Unix系統的推薦設置。("core.autocrlf" is set to "input")htm

  • Checkout as-is, commit as-is

不管是檢出仍是提交文本文件時,Git都不會作任何轉換。對於跨平臺的項目,不推薦採用該選項。

顯然,第一個選項就是咱們所介紹的第一種方法。

順便吐槽一下,我在網上看到不少介紹如何安裝Git的博客,不多有詳細說明每個安裝步驟的,有些甚至直接說

一直next下去就安裝完成了。

一方面緣由就是他們也不知道,其實這樣可能會對新手產生誤導,並且未免有些不負責任。

單一倉庫的換行符局部配置

固然,有更好的方法解決換行符不統一的問題——使用.gitattributes文件統一換行符。這種方法是針對某個倉庫進行換行符的統一配置,即時你已經進行了全局配置。

另外,這個文件有點兒相似於.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

對左邊匹配的文件統一使用CRLF換行符格式,若是有文件中出現LF將會轉換成CRLF。

  • text eol=lf

對左邊匹配的文件統一使用LF換行符格式,若是有文件中出現CRLF將會轉換成LF。

  • binary

告訴git這不是文本文件,不該該對其中的換行符進行改變。另外,binary和符號-text -diff是等價的。

上面這些語法應該已經足夠了,若是有興趣的,能夠自行查閱相關資料,好比官方的資料:https://git-scm.com/book/en/v...

若是建立倉庫以前沒有進行換行符配置怎麼辦

也許你在看完個人博客以後,才意識到本身並未進行相關的設置抑或是你想修改換行符配置,因而你興致勃勃地按照個人博客進行了配置,結果你發現出了一堆莫名其妙的警告或者錯誤。

怪我嘍?

guaiwolou

不要着急吐槽,兵來將擋,水來土掩,沒有解決不了的問題!

  • 首先保存Git中目前的全部文件,這樣能夠確保你的工做不會丟失。
# 在倉庫的根目錄下運行命令
$ git add . -u
$ git commit -m "Saving files before refreshing line endings"
  • 而後刪除暫存區中的全部文件,
$ git rm --cached -r .
  • 重寫暫存區以從新應用新的換行符
$ git reset --hard
  • 找回全部修改過的文件並加入暫存區,同時,你也能夠查看些文件沒有被修改。
$ git add .
# 出現"warning: CRLF will be replaced by LF in file."的警告是很正常的現象
  • 提交你對倉庫的修改
$ git commit -m "Normalize all the line endings"

參考資料

相關文章
相關標籤/搜索