問題背景
在Windows
筆記本上新拉完代碼,在執行pre-commit
時,出現如下錯誤:
Delete `␍`eslint(prettier/prettier)
下面是幾種個人嘗試過的解決方案:
解決方案
一、Crtl+S保存文件
按Crtl+S
保存當前報錯文件,eslint
錯誤消失,但是Git
暫存區多了個文件改動記錄,對比Working tree
沒發現任何不同。
缺點:你不可能一一保存所有文件,麻煩,還要commit
,多余。
二、yarn run lint --fix
比上面省事,eslint
錯誤消失,但暫存區多了n
個文件改動記錄,對比Working tree
也沒發現任何不同。
缺點:需要commit
所有文件,多余。
參考資料:"error Delete ⏎ prettier/prettier" in .vue files``
三、配置.prettierrc文件
在項目根目錄下的.prettierrc
文件中寫入即可。其實就是不讓prettier
檢測文件每行結束的格式.
"endOfLine": "auto"
缺點:不能兼容跨平台開發,從前端工程化上講沒有做到盡善盡美。
參考資料:Why do I keep getting Delete ‘cr’ [prettier/prettier]?
四、通過IDE一鍵切換
這是評論區掘金同道提供的方法,一般IDE下方狀態欄會提供“切換行尾序列”的工具,如上圖,一鍵切換到正確的行尾序列即可。
缺點:只能修復當前文件,不能解決整個項目報錯的問題。
五、最佳方案
問題根源:
罪魁禍首是git
的一個配置屬性:core.autocrlf
由於歷史原因,windows
下和linux
下的文本文件的換行符不一致。
Windows
在換行的時候,同時使用了回車符CR(carriage-return character)
和換行符LF(linefeed character
)- 而
Mac
和Linux
系統,僅僅使用了換行符LF
- 老版本的
Mac
系統使用的是回車符CR
Windows | Linux/Mac | Old Mac(pre-OSX) |
---|---|---|
CRLF | LF | CR |
'\n\r' | '\n' | '\r' |
因此,文本文件在不同系統下創建和使用時就會出現不兼容的問題。
我的項目倉庫中默認是Linux
環境下提交的代碼,文件默認是以LF
結尾的(工程化需要,統一標准)。
當我用windows
電腦git clone
代碼的時候,若我的autocrlf
(在windows
下安裝git
,該選項默認為true
)為true
,那么文件每行會被自動轉成以CRLF
結尾,若對文件不做任何修改,pre-commit
執行eslint
的時候就會提示你刪除CR
。
現在可以理解ctrl+s
和yarn run lint --fix
方案為何可以修復eslint
錯誤了吧,因為Git
自動將CRLF
轉換成了LF
。
最佳實踐:
現在VScode
,Notepad++
編輯器都能夠自動識別文件的換行符是LF還是CRLF
。
如果你用的是windows
,文件編碼是UTF-8
且包含中文,最好全局將autocrlf
設置為false
。
git config --global core.autocrlf false
注意:git
全局配置之后,你需要重新拉取代碼。
總結
查找了不少資料,stackoverflow
、github
上對這個問題有相應的討論和解決辦法,但都不能觸及靈魂。作下此文,以便日后翻閱,若對遇坑的朋友有所幫助,筆者樂此不疲!