在Git中一定要關注的crlf自動轉換

2022-10-10 12:48:11 字數 1219 閱讀 6252

github 第一坑:換行符自動轉換

如果你已經做出了錯誤的選擇,也不需要重新安裝,可以直接使用命令列來修改設定。很簡單,直接開啟這貨自帶的命令列工具 git bash,輸入以下命令,再敲回車即可:

git config --global core.autocrlf false

在各作業系統下,文字檔案所使用的換行符是不一樣的。unix/linux 使用的是0x0a(lf),早期的 mac os 使用的是0x0d(cr),後來的 os x 在更換核心後與 unix 保持一致了。但 dos/windows 一直使用0x0d0a(crlf)作為換行符。(不知道 bill gates 是怎麼想的,雙向相容?)

這種不統一確實對跨平台的檔案交換帶來麻煩。雖然靠譜的文字編輯器和 ide 都支援這幾種換行符,但檔案在儲存時總要有乙個固定的標準啊,比如跨平台協作的專案原始碼,到底儲存為哪種風格的換行符呢?

git 作為乙個原始碼版本控制系統,以一種(我看起來)有點越俎代庖、自作聰明的態度,對這個問題提供了乙個「解決方案」。

git 由大名鼎鼎的 linus 開發,最初只可執行於 *nix 系統,因此推薦只將 unix 風格的換行符儲存入庫。但它也考慮到了跨平台協作的場景,並且提供了乙個「換行符自動轉換」功能。

安裝好 github 的 windows 客戶端之後,這個功能預設處於「自動模式」。當你在簽出檔案時,git 試圖將 unix 換行符(lf)替換為 windows 的換行符(crlf);當你在提交檔案時,它又試圖將 crlf 替換為 lf。

這是乙個相當大的坑,windows 下的中文開發者幾乎都會中招。舉個例子,你在 windows 下用預設狀態的 git 簽出乙個檔案,寫了一行中文注釋(或者這個檔案本來就包含中文),然後存檔提交……不經意間,你的檔案就被毀掉了。

因為你提交到倉庫的檔案已經完全變成了 windows 風格(簽出時把 unix 風格轉成了 windows 風格但提交時並沒有轉換),每一行都有修改(參見本文開頭的示意圖),而這個修改又不可見(大多數 diff 工具很難清楚地顯示出換行符),這最終導致誰也看不出你這次提交到底修改了什麼。

這還沒完。如果其他小夥伴發現了這個問題、又好心地把換行符改了回來,然後你又再次重演上面的悲劇,那麼這個檔案的編輯歷史基本上就成為乙個謎團了。

由於老外幾乎不可能踩到這個坑,使得這個 bug 一直隱秘地存在著。但在網上隨便搜一下,就會發現受害者絕對不止我乙個。

人生中一定要堅守的格言

少許諾,多兌現 人一定要做自己擅長且喜歡的事情 專注如一 證明自己,用結果說話 聽多數人的意見,和少數人商量,自己做決定 始終保持學習的心態 幫助別人,成就自己 少埋怨,多做事 每天給自己乙個希望,試著不為明天而煩惱,不為昨天而嘆息,只為今天的美好 生活 夏日的烈日不見了,習習涼風已來,是時候出去玩...

面試中一定要準備的7種排序演算法

1.氣泡排序 public int bubblesort int arr return arr 氣泡排序的改進 稍微優化一下,對於排序好的如123456789,會一直交換多次 public void bubblesortbetter int arr 2.選擇排序 public void choose...

在電工操作的步驟中一定要注意一下問題!

電工工作中應注意的安全問題工作人員在用電時必須養成 一站式 雙眼 三思 四手 的習慣。所謂停止是指在你開始工作之前,特別是在你接觸帶電部分之前,你必須停下來。停頓的習慣不應該一上公升就去做。停頓的目的是要向一對人看一看。看看兩邊的刀門是否確實與開關和地面脫節,以及一對線或裝置的名稱和編織,這個數字是...