git如何避免”warning: LF will be replaced by CRLF“提示?

windows平台下使用git add文件时出现”warning: LF will be replaced by CRLF“提示。 在网上很多博客说设…
关注者
134
被浏览
491,091
登录后你可以
不限量看优质回答私信答主深度交流精彩内容一键收藏
--2022年5月更新--
这篇回答是几年前粗略读了 git 源码和文档写下的,表述得比较混乱,看到一直有朋友在点赞,但还有很多疑问,就再更新一下。因为从事工作不经常接触 git 了,加上 git 一直在迭代,部分的细节可能会随着时间变化而不准确了。

首先,警告产生的原因是 git 的 core.autocrlf 配置为 true 时,git add 发现了需要提交的内容存在 LF 换行符,如下图

core.autocrlf=true

这句警告的下面其实还有一句重要的话:

warning: LF will be replaced by CRLF in <file-name>.
The file will have its original line endings in your working directory.

(翻译下就是:“在工作区里,这个文件会保持它原本的换行符。”)

简单来说,设置 core.autocrlf=true 后,git 会认为工作区的文件都应该用 CRLF 来换行,如果工作区因为新增或编辑出现了 LF 换行符的文件,git add 这些文件时,发现准备提交的文件是 LF 作为换行符,就会出现这个警告,并提示哪些文件是 LF 换行的(但 git 不会对工作区这些文件做换行符的转换)

当设置 core.autocrlf=true 时, 解决问题最简单的方式是,只要保持工作区文件都用 CRLF 换行,编辑器设定为用 CRLF 换行,就不会出现警告了(题主提的问题 2)。但 core.autocrlf=true 是有争议的配置,感兴趣可以往下看。


这里引出了一个问题,就是 core.autocrlf=true 这个设置是合理的吗?首先在 Windows 下有很多人遇到这个 "LF will be replaced by CRLF" 告警,可能是因为 Git Bash 在安装时默认设置了core.autocrlf=true,如图

红框为安装时默认设置

回到题主提到的问题 1:在实际开发中,是存在软件工具严格要求配置文件的编码和换行符的情况,让 git 在 checkout 和 commit 时自动转换换行符不一定是件好事。并且在多人协作时,没法确保所有人的 core.autocrlf 都是同样的配置。因此 core.autocrlf 这个配置需要在了解清楚后再进行使用。比较推荐的做法是使用 .gitattributes[1] 指定项目中各类文件适用的换行符。


关于 core.autocrlf

这个配置可以设定三个值,分别是 true,input,false,每个配置的具体行为可以看上面那张安装界面的截图。比较有意思的是,当设置为 input 时,如果 git add 了 CRLF 换行的文件时,会出现和题目相反的警告: " CRLF will be replaced by LF in ... " 这两种警告都会提醒那些被 git 的自动转化换行符行为影响到的文件,这些文件在别处重新检出时可能会得到不同的换行符。而配置了 .gitattributes 却可以保证在各平台多人协作时文件属性的一致性,.gitattributes 会覆盖 core.autocrlf 的设置,在多数情况下是比 core.autocrlf 更好的选择。


如果还有疑问,推荐阅读下面链接的内容:

1. 配置 Git 处理行结束符 - GitHub Docs

2. Git - gitattributes Documentation

3. Git - 配置 Git

4. git 源码 - convert.c (处理换行符)

参考

  1. ^配置 Git 处理行结束符 - GitHub Docs https://docs.github.com/cn/get-started/getting-started-with-git/configuring-git-to-handle-line-endings#per-repository-settings
编辑于 2022-05-03 01:59・IP 属地浙江