問題背景
在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上對這個問題有相應的討論和解決辦法,但都不能觸及靈魂。作下此文,以便日后翻閱,若對遇坑的朋友有所幫助,筆者樂此不疲!
