问题背景
在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
上对这个问题有相应的讨论和解决办法,但都不能触及灵魂。作下此文,以便日后翻阅,若对遇坑的朋友有所帮助,笔者乐此不疲!
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。