一. git add -A报错
在利用git add -A添加文件时,意外的发现报错了
报错信息中:
-
LF:Line Feed 换行
-
CRLF:Carriage Return Line Feed 回车换行键
大意是:
警告:today.txt(我要添加的文件名)中LF被CRLF替换
在工作区里,这个文件将会保持它原来的换行符
二. 什么原因
1. 不同操作系统的行尾结束符(换行符)是不同的
-
windows下:CRLF(" ",使用回车换行两个字符)
-
unix下:LF(" ",只使用换行)
-
mac下:CR(" ",只使用回车)
2. 使用Git Bash,相当于Linux环境
3. 我的文件也是通过touch today.txt和vim today.txt写入的,这种情况下换行符是Linux下的LF
4. git工作区默认以CRLF来作为换行符,如果我们的文件中使用LF作为换行符,这时我们继续git add或git commit就会弹出警告,当最终push到远程仓库的时候,git会统一转化,最终以CRLF作为换行符
5. 如何理解 "The file will have its original line endings in your working directory."
简单来说,设置 core.autocrlf=true 后,我们工作区的文件都应该用 CRLF 来换行。如果改动文件时引入了 LF,或者设置 core.autocrlf 之前,工作区已经有 LF 换行符。提交改动时,git 会警告你哪些文件不是纯 CRLF 文件,但 git 不会擅自修改工作区的那些文件,而是对暂存区(我们对工作区的改动)进行修改。也因此,当我们进行 git add 的操作时,只要 git 发现改动的内容里有 LF 换行符,就还会出现这个警告
三. 解决方案
1. git中如何处理"换行"(line ending)
core.autocrlf是git中负责处理line ending的变量,可以设置三个值:true, false, input,默认是true
-
true:这意味着当你添加文件到git仓库时,git都会视它为文本文件,将其换行符LF转化为CRLF
-
false:当设置成false时,line endings将不做转换操作。文本文件保持原来的样子
-
input:设置为input时,添加文件git仓库时,git把crlf编程lf。当有人Check代码时还是lf方式。因此在window操作系统下,不要使用这个设置
2. 使用 git config --global core.autocrlf false 来解决
3. core.autocrlf设置为false的风险
多人协作开发时,如果 windows 上设置 core.autocrlf=false,仓库里也没有配置 .gitattributes,很容易引入 CRLF 或者混合换行符(Mixed Line Endings,一个文件里既有 LF 又有CRLF)到版本库,这样就可能产生各种奇怪的问题
如果有换行符不匹配本地平台的情况,建议用 dos2unix 之类的工具转换下换行符,因为很多配置文件是严格要求文件编码和换行符的,谨慎一点比较好
参考文章
https://www.cnblogs.com/helloHKTK/p/7351946.html
https://blog.csdn.net/wowoniuzailushang/article/details/54317129
https://www.zhihu.com/question/50862500/answer/123197258