Git中CRLF与LF的转换
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種:
可以發現,如果不使用第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文件。
core.autocrlf 的配置依賴于每一位參與項目的開發機器上的配置,這很難確保每個人都能正確配置。于是在規范項目中的換行符方面,還有一套添加配置文件的方案。在項目的根目錄下可以添加一個.gitattributes 文件。它的優先級高于core.autocrlf的設置,可以覆蓋core.autocrlf的。它類似于 .gitignore 文件,隨提交修改生效,一個項目中可以維持一份相同的配置。所以,它能夠避免每個開發人員配置不同的問題。
對于通過.gitattributes設置換行符的轉換方案,可以使用如下的命令:
1. text=auto:采用git認為最好的方式來處理文件,未在.gitattributes中設置的項默認按照這種方式處理;(If Git decides that the contentis 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:此設置強制Git在checkin時對此文件的行尾標準化為LF,并在checkout文件時將其轉換為CRLF。6. eol=lf:此設置強制Git在checkin時將行尾標準化為LF,并在checkout文件時阻止轉換為CRLF(如果是LF,阻止其轉換為CRLF;如果已經是CRLF,是不會進行轉換的)。7. binary: 告訴git該文件為二進制,防止git修改該文件。git不會對對其中的換行符進行改變。等加于-text -diff,和字符編碼work-tree-encoding沒關系(binary不會影響文件編碼) https://stackoverflow.com/questions/33085428/gitattributes-and-the-binary-option注意:.gitattributes文件必須要提交之后才能生效。eol=lf與eol=crlf的區別:
標準化: 指在提交代碼到git數據庫(本地庫) 中將文本文件中的換行符CRLF轉為LF的過程
轉換: 指在檢出Git數據庫代碼過程中將文本文件中的換行符LF轉換為CRLF的過程
eol=lf: 標準化 + 不轉換
eol=crlf 標準化 + 轉換
參考博客:
總結
以上是生活随笔為你收集整理的Git中CRLF与LF的转换的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 前端 Git CRLF 与 LF格式的批
- 下一篇: PD3.0详解 第十章 策略层 电源协商