Git處理換行符問題

在你通過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時,你可能已經進行過這樣的配置恢准,也許你當時并未知道那個選項是什么意思魂挂。下面這張圖是不是有些眼熟呢?

git安裝選項

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"

參考資料

注:本文遷移自我的CSDN博客:https://blog.csdn.net/github_30605157/article/details/56680990
簸搞。

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市准潭,隨后出現的幾起案子趁俊,更是在濱河造成了極大的恐慌,老刑警劉巖刑然,帶你破解...
    沈念sama閱讀 212,542評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件寺擂,死亡現場離奇詭異,居然都是意外死亡泼掠,警方通過查閱死者的電腦和手機怔软,發(fā)現死者居然都...
    沈念sama閱讀 90,596評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來择镇,“玉大人挡逼,你說我怎么就攤上這事∧逋悖” “怎么了家坎?”我有些...
    開封第一講書人閱讀 158,021評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長饲梭。 經常有香客問我乘盖,道長,這世上最難降的妖魔是什么憔涉? 我笑而不...
    開封第一講書人閱讀 56,682評論 1 284
  • 正文 為了忘掉前任订框,我火速辦了婚禮,結果婚禮上兜叨,老公的妹妹穿的比我還像新娘穿扳。我一直安慰自己衩侥,他們只是感情好,可當我...
    茶點故事閱讀 65,792評論 6 386
  • 文/花漫 我一把揭開白布矛物。 她就那樣靜靜地躺著茫死,像睡著了一般。 火紅的嫁衣襯著肌膚如雪履羞。 梳的紋絲不亂的頭發(fā)上峦萎,一...
    開封第一講書人閱讀 49,985評論 1 291
  • 那天,我揣著相機與錄音忆首,去河邊找鬼爱榔。 笑死,一個胖子當著我的面吹牛糙及,可吹牛的內容都是我干的详幽。 我是一名探鬼主播,決...
    沈念sama閱讀 39,107評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼浸锨,長吁一口氣:“原來是場噩夢啊……” “哼唇聘!你這毒婦竟也來了?” 一聲冷哼從身側響起柱搜,我...
    開封第一講書人閱讀 37,845評論 0 268
  • 序言:老撾萬榮一對情侶失蹤迟郎,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后冯凹,有當地人在樹林里發(fā)現了一具尸體谎亩,經...
    沈念sama閱讀 44,299評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,612評論 2 327
  • 正文 我和宋清朗相戀三年宇姚,在試婚紗的時候發(fā)現自己被綠了匈庭。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,747評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡浑劳,死狀恐怖阱持,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情魔熏,我是刑警寧澤衷咽,帶...
    沈念sama閱讀 34,441評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站蒜绽,受9級特大地震影響镶骗,放射性物質發(fā)生泄漏。R本人自食惡果不足惜躲雅,卻給世界環(huán)境...
    茶點故事閱讀 40,072評論 3 317
  • 文/蒙蒙 一鼎姊、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦相寇、人聲如沸慰于。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽婆赠。三九已至,卻和暖如春佳励,著一層夾襖步出監(jiān)牢的瞬間休里,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評論 1 267
  • 我被黑心中介騙來泰國打工植兰, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留份帐,地道東北人。 一個月前我還...
    沈念sama閱讀 46,545評論 2 362
  • 正文 我出身青樓楣导,卻偏偏與公主長得像,于是被迫代替她去往敵國和親畜挨。 傳聞我的和親對象是個殘疾皇子筒繁,可洞房花燭夜當晚...
    茶點故事閱讀 43,658評論 2 350

推薦閱讀更多精彩內容

  • 我猜點進來看的客官,至少都是使用過 Git 的巴元。另外有些客官毡咏,可能知道,如果 Git 的換行符處理不當逮刨,就會產生某...
    王菜刀閱讀 13,721評論 1 11
  • 轉載自: git 換行符LF與CRLF轉換問題 一呕缭、背景 在各操作系統(tǒng)下,文本文件所使用的換行符是不一樣的修己。UNI...
    code_solve閱讀 1,005評論 0 1
  • 背景 在各操作系統(tǒng)下恢总,文本文件所使用的換行符是不一樣的。UNIX/Linux 使用的是 0x0A(LF)睬愤,早期的 ...
    小孩真笨閱讀 616評論 0 1
  • 背景 在各操作系統(tǒng)下片仿,文本文件所使用的換行符是不一樣的。UNIX/Linux 使用的是 0x0A(LF)尤辱,早期的 ...
    晝暗閱讀 892評論 0 0
  • 今天感恩節(jié)哎砂豌,感謝一直在我身邊的親朋好友。感恩相遇光督!感恩不離不棄阳距。 中午開了第一次的黨會,身份的轉變要...
    迷月閃星情閱讀 10,559評論 0 11