解决 git commit 失败的问题:warning: LF will be replaced by CRLF

问题描述

在 gitee.com 创建了一个 repository, 上传了一个 github 的开源项目,在 windows 下 git clone 下来,用 IDEA 正常修改,然后 commit 失败,提示:warning: LF will be replaced by CRLF

原因分析

原因应该是我在 Windows 环境对文件进行操作,而我拷贝的文件原作者应该是在 Linux 系统是进行编辑的,因此导致此情况的发生,下面是官方的说明点击这里看原文:

格式化与空白是许多开发人员在协作时,特别是在跨平台情况下,遇到的令人头疼的细小问题。由于编辑器的不同或者 Windows 程序员在跨平台项目中的文件行尾加入了回车换行符,一些细微的空格变化会不经意地进入大家合作的工作或提交的补丁中。不用怕,Git 的一些配置选项会帮助你解决这些问题。

假如你正在Windows上写程序,又或者你正在和其他人合作,他们在Windows上编程,而你却在其他系统上,在这些情况下,你可能会遇到行尾结束符问题。这是因为Windows使用回车和换行两个字符来结束一行,而 Mac和 Linux 只使用换行一个字符。虽然这是小问题,但它会极大地扰乱跨平台协作。

Git 可以在你提交时自动地把行结束符 CRLF 转换成 LF,而在签出代码时把 LF 转换成 CRLF。用 core.autocrlf 来打开此项功能,如果是在 Windows 系统上,把它设置成 true,这样当签出代码时,LF 会被转换成 CRLF:

1
$ git config --global core.autocrlf true

Linux 或 Mac 系统使用 LF 作为行结束符,因此你不想 Git 在签出文件时进行自动的转换;当一个以 CRLF 为行结束符的文件不小心被引入时你肯定想进行修正,把 core.autocrlf 设置成 input 来告诉 Git 在提交时把 CRLF 转换成 LF,签出时不转换:

1
$ git config --global core.autocrlf input

这样会在 Windows 系统上的签出文件中保留 CRLF,会在 Mac 和 Linux 系统上,包括仓库中保留 LF。

如果你是 Windows 程序员,且正在开发仅运行在 Windows 上的项目,可以设置 false 取消此功能,把回车符记录在库中:

1
$ git config --global core.autocrlf false

解决方案

由于我使用别的人模板文件是在 Linux 系统编辑的,Linux 系统使用 LF 作为换行符,我只能将就把 core.autocrlf 设置成 false,这样才不会有警告,但是如果开始就在 Windows 上进行开发,应该将它设置成 true 才对。

新问题

按照上面的操作之后,有一个旧项目,因为我把项目从之前的账号迁移至新注册的账号,但是提交之后,还是显示提交者为旧账号,于是我重新 clone 新账号下的项目,然后只把 .git 目录替换至项目根目录下,提示有几个文件有修改,push 的时候报下面的错。几乎没有解。
分析了一下操作过程,该项目应该是在执行过 git config --global core.autocrlf false 之前就存在,现在 clone 到本地,LF 已经被 修改成 CRLF 了,所以,新 .git 目录匹配到旧项目中的文件,就提示有修改。
那么,push 的时候,之所以会失败,我分析应该是在 push 的时候,会还原 clone 时的修改,也就是,把 CRLF 再替换回 LF,在这个过程中,可能还存在一些不兼容的修改,所以会 push 失败。

1
0 files committed, 5 files failed to commit: improve warning: LF will be replaced by CRLF in .gitignore. The file will have its original line endings in your working directory. warning: LF will be replaced by CRLF in pom.xml. The file will have its original line endings in your working directory. warning: LF will be replaced by CRLF in src/main/java/com/example/demo/DemoApplication.java. The file will have its original line endings in your working directory. warning: LF will be replaced by CRLF in src/main/java/com/example/demo/config/ElasticsearchConfig.java. The file will have its original line endings in your working directory. warning: LF will be replaced by CRLF in src/test/java/com/example/demo/DemoApplicationTests.java. The file will have its original line endings in your working directory.

解决

知道原因就好办了,执行 git config --global core.autocrlf false 之后,之前的项目,不要直接替换 .git 目录,如果有这个需要,则要连项目文件一起替换。

linebreak-style

1
ESLint: Expected linebreaks to be 'LF' but found 'CRLF'.(linebreak-style)