源起
一直想在 GitHub 上發(fā)布項目、參與項目,但 Git 這貨比較難學(xué)啊。買了一本《Git 權(quán)威指南》,翻了幾頁,媽呀,那叫一個復(fù)雜,又是 Cygwin 又是命令行的,嚇得我不敢學(xué)了。
終于某天發(fā)現(xiàn) GitHub 還有一個 Windows 客戶端,試了一下還挺好用。不需要掌握太多的 Git 原理和命令,也可以在 GitHub 上麻溜建項目了,甚是歡喜。可是好景不長,第一次參與開源項目出洋相了。
經(jīng)過
小心翼翼地 Fork 了樸靈大大 (@JacksonTian) 的 EventProxy 項目,本地改好提交,同步到服務(wù)器,懷著激動的心情發(fā)出 Pull Request……這時發(fā)現(xiàn)問題了。我發(fā)現(xiàn) diff 圖表顯示的更新并不僅是我修改的那幾行,而是整個文件都顯示為已修改。(下圖為示意圖)
這看起來很奇怪啊,于是趕緊撤回 Pull Request,自己悶頭找原因。
初步定位是文件的換行符問題,因為我發(fā)現(xiàn)本地的文件是 Windows 換行符,但很顯然大家現(xiàn)在做項目都是用 UNIX 換行符啊。這是一大疑點,于是在反復(fù)對比 Web 端和本地的各個文件、各個版本之后,基本定位到了問題所在。
背景
在各操作系統(tǒng)下,文本文件所使用的換行符是不一樣的。UNIX/Linux 使用的是 0x0A(LF),早期的 Mac OS 使用的是 0x0D(CR),后來的 OS X 在更換內(nèi)核后與 UNIX 保持一致了。但 DOS/Windows 一直使用 0x0D0A(CRLF)作為換行符。(不知道 Bill Gates 是怎么想的,雙向兼容?)
這種不統(tǒng)一確實對跨平臺的文件交換帶來麻煩。雖然靠譜的文本編輯器和 IDE 都支持這幾種換行符,但文件在保存時總要有一個固定的標(biāo)準(zhǔn)啊,比如跨平臺協(xié)作的項目源碼,到底保存為哪種風(fēng)格的換行符呢?
Git 作為一個源碼版本控制系統(tǒng),以一種(我看起來)有點越俎代庖、自作聰明的態(tài)度,對這個問題提供了一個“解決方案”。
Git 由大名鼎鼎的 Linus 開發(fā),初只可運行于 *nix 系統(tǒng),因此推薦只將 UNIX 風(fēng)格的換行符保存入庫。但它也考慮到跨平臺協(xié)作的場景,并且提供了一個“換行符自動轉(zhuǎn)換”功能。