1. 问题描述
windows10 环境下,创建了一个 txt 文件,把该文件添加到仓库中报错。
警告信息如下所示:git add readme.txt , 把 readme.txt 是要添加的文件。
2. 错误分析
分析参考这篇文章:https://blog.csdn.net/starry_night9280/article/details/53207928。
问题的原因:
(1)Uinx/Linux采用换行符LF表示下一行(LF:LineFeed,中文意思是换行);
(2)Dos和Windows采用回车+换行CRLF表示下一行(CRLF:CarriageReturn LineFeed,中文意思是回车换行);
(3)Mac OS采用回车CR表示下一行(CR:CarriageReturn,中文意思是回车)。
可以知道我们在编写 readme.txt 中使用的 Linux的换行符,他要把它替换为 CRLF,Windows 中的换行。
查看自己的 Git 对待换行符的方式:
git config core.autocrlf
命令的输出有三种输出:
(1)为true时,Git会将你add的所有文件视为文本问价你,将结尾的CRLF转换为LF,而checkout时会再将文件的LF格式转为CRLF格式。
(2)为false时,line endings不做任何改变,文本文件保持其原来的样子。
(3)为input时,add时Git会把CRLF转换为LF,而check时仍旧为LF,所以Windows操作系统不建议设置此值。
如图,我的设置如下所示:
3. 错误解决
设置为 false ,命令如下所示:
git config --global core.autocrlf false
如下图所示:
再次提交就会没有警告:
一些问题:
将core.autocrlf设为false即可解决这个问题,不过如果你和你的伙伴只工作于Windows平台 或者 Linux平台,那么没问题,不过如果是存在跨平台的现象的话,还是需要考虑一下。
但当 core autocrlf为true时,还有一个需要慎重的地方,当你上传一个二进制文件,Git可能会将二进制文件误以为是文本文件,从而也会修改你的二进制文件,从而产生隐患。
4. 扩展
我的师傅告诉我,你已经学了80%,为什么不学到100%,我觉得师傅说的很对,所以以后每解决一个问题(或学习一个知识点)都要尝试搞清楚这个问题,当然我可能还是做不到 100%,但是会向100%去靠拢。
问题一:不同操作系统中的换行符。
参考这篇文章:https://blog.csdn.net/lijing742180/article/details/85018164。
\r
表示回车,即CR (carriage return)
\n
表示换行,即LF (linefeed)
回车和换行
计算机还没有出现之前,使用的是电传打字机来打字(就是上一篇文章中提到的 Teletypewriter)。
电传打字机每秒钟可以打10个字符。但是它有一个问题,就是打完一行换行的时候要用掉0.2秒,正好可以打两个字符。
如果在这0.2秒里面,又有新的字符传过来,那么这个字符将会丢失。
于是科学家想了个办法解决这个问题,就是在每行后面加两个表示结束的字符,回车和换行:
回车,符号 \r;是告诉打字机把打印头定位在左边界;
换行,符号 \n;是告诉打字机把纸张向下方移动一行;
不同系统下的实现方式
后来,计算机发明了,回车和换行的概念就被用到了计算机上。当时存储器很贵,一些科学家认为在每行结尾加两个字符太浪费空间了,于是,就出现了分歧。
类 Unix 系统里,每行结尾只有“<换行>”,即“\n”;
Windows系统里面,每行结尾是“<回车><换行>”,即“ \r\n”;
Mac系统里,每行结尾是“<回车>”,即“\r”。
可能会出现的问题
因为换行符的问题,在一个系统下编辑的文件放到另一个系统下时,可能会显示不正常。
常见的会有以下两种情况:
在类 Unix 系统或 Mac 系统中编辑的文件,在 Windows 记事本中多行文字会变成一行(但是有些智能编辑器会自动识别不同系统的换行符,并进行转换,如 UE、Notepad++)。
在 Windows 记事本中编辑的文件,在其它系统中会多显示一个控制字符 ^M(在 Linux 中,回车符 \r会作为控制字符 ^M显示)。
问题二:git core.autocrlf配置说明
参考这篇文章:https://www.jianshu.com/p/38f04aef1c9d。
假如你正在Windows上写程序,又或者你正在和其他人合作,他们在Windows上编程,而你却在其他系统上,在这些情况下,你可能会遇到行尾结束符问题。
这是因为Windows使用回车和换行两个字符来结束一行,而Mac和Linux只使用换行一个字符。虽然这是小问题,但它会极大地扰乱跨平台协作。
(1)Git可以在你提交时自动地把行结束符CRLF转换成LF,而在签出代码时把LF转换成CRLF。
用core.autocrlf来打开此项功能,如果是在Windows系统上,把它设置成true,这样当签出代码时,LF会被转换成CRLF:
git config --global core.autocrlf true
(2)Linux或Mac系统使用LF作为行结束符,因此你不想 Git 在签出文件时进行自动的转换;当一个以CRLF为行结束符的文件不小心被引入时你肯定想进行修正,把core.autocrlf设置成input来告诉 Git 在提交时把CRLF转换成LF,签出时不转换:
git config --global core.autocrlf input
这样会在Windows系统上的签出文件中保留CRLF,会在Mac和Linux系统上,包括仓库中保留LF。
(3)如果你是Windows程序员,且正在开发仅运行在Windows上的项目,可以设置false取消此功能,把回车符记录在库中:
git config --global core.autocrlf false
参考文献
- https://www.liaoxuefeng.com/wiki/896043488029600/896827951938304
- https://blog.csdn.net/starry_night9280/article/details/53207928
- https://blog.csdn.net/lijing742180/article/details/85018164
- https://www.jianshu.com/p/38f04aef1c9d