当前位置: 代码迷 >> 综合 >> $ git add readme.txt warning: LF will be replaced by CRLF in readme.txt. The file will have its orig
  详细解决方案

$ git add readme.txt warning: LF will be replaced by CRLF in readme.txt. The file will have its orig

热度:35   发布时间:2023-12-26 12:46:43.0

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

 

  相关解决方案