今天把項目做完之后,然后用Git准備提交代碼的時候,遇到warning: LF will be replaced by CRLF警告。
當時在網上查了資料,發現很多的解決辦法都是:修改git全局配置,禁止git自動將LF轉化成CRLF。命令是:git config --global core.autocrlf false
.
LF和CRLF的真相是什么
1.LF和CRLF都是換行符,在各操作系統下,換行符是不一樣的,Linux/UNIX下是LF,而Windows下是CRLF,早期的MAC OS是CR,后來的OS X在更換內核后和UNIX一樣也是LF.
這種不統一確實對跨平台的文件交換帶來了麻煩。雖然靠譜的文本編輯器和 IDE 都支持這幾種換行符,但文件在保存時總要有一個固定的標准啊,比如跨平台協作的項目源碼,到底保存為哪種風格的換行符呢?
2.Git 由大名鼎鼎的 Linus 開發,最初只可運行於 *nix 系統,因此推薦只將 UNIX 風格的換行符保存入庫。但它也考慮到了跨平台協作的場景,並且提供了一個“換行符自動轉換”功能。
- 安裝好 GitHub 的 Windows 客戶端之后,這個功能默認處於“自動模式”。
- 當你在簽出文件時,Git 試圖將 UNIX 換行符(LF)替換為 Windows 的換行符(CRLF);當你在提交文件時,它又試圖將 CRLF 替換為 LF。
所以Git在拉取代碼的時候,git會自動將代碼之中與你當前系統不同的換行方式自動轉換成當前系統的換行方式。
這樣一來在提交代碼的時候,git會認為你未修改內容的文件也認為是修改過的,然后提示你warning: LF will be replaced by CRLF這樣的信息。
3.上面的解決辦法固然解決了很多人的問題,但是在某些情況下就不適用。這次項目中,在用fiskit框架npm deploy打包前端文件到后端路徑的時候,打包出來的文件用git進行commit的時候,提示LF和CRLF,文件的換行符被修改過,這時候也嘗試了上面的方法,也沒有用,最后在知乎上看到一篇文章https://www.zhihu.com/question/50862500,
有效的解決方法
如果設置core.autocrlf = false
,那么很可能會出現CRLF和LF混合的情況,這樣會導致一些問題,例如git diff
失去功能,會發現很多行代碼並沒有修改,然而被認為是修改過了。
首先core.autocrlf = true
在windows上才是正確的選擇,那么如何避免warning呢?還要有以下幾個步驟:
- 添加.gitattributes
- 設置
core.safecrlf = true
- 使用dos2unix、notepad++等工具來將LF轉換成CRLF