欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

git提示CRLF will be replaced by LF问题及解决

程序员文章站 2022-07-06 19:56:21
...

现象

同一个项目多个人开发的时候,每个人使用的OS可能不一样,有的使用Mac OS、有的使用Windows、有的使用Linux或Unix平台。虽然不同的系统都可以进行代码开发,但是不同系统的换行符是不一样的,在提交代码的时候甚至经常看到这方面的冲突。例如,本来代码是A同学使用Mac OS开发的,后来B同学加入,使用Windows系统开发,修改了go/servers/xxx.go文件,在使用git add go/servers/xxx.go命令添加修改内容到远程代码仓库的时候,就会出现下面的提示。


warning: CRLF will be replaced by LF in go/servers/xxx.go.
The file will have its original line endings in your working directory

原因

为什么会出现上面的问题呢?

UNIX/Linux 使用的是 0x0A(LF),早期的 Mac OS 使用的是 0x0D(CR),后来的 OS X 在更换内核后与 UNIX 保持一致。但 DOS/Windows 一直使用 0x0D0A(CRLF) 作为换行符。所以会出现使用mac的开发者修改的代码中是lf换行,windows用户使用的crlf换行符,同时存在两种系统提交的代码时,总是会互相影响。

另外一个原因是,git默认配置autocrlf=true,即所有代码在添加提交时都会被提交成crlf,但是如果不同开发者配置的autocrlf不一致(比如,input或者false),就会出现总是互相覆盖的情况。

可以先查看一下git配置信息,命令如下:

git config -l

发现配置如下:

core.autocrlf=true   // 该配置使git自动将lf转换成crlf
core.fscache=true
core.symlinks=false
core.longpaths=true
pull.rebase=false
...

解决

首先,可以全局配置git禁止自动将lf转为crlf。然后,全局配置在提交时转换为lf。最后,配置crlf包含混合换行时拒绝提交。

// 修改git全局配置,禁止git自动将lf转换成crlf
git config --global core.autocrlf false

// 配置全局git命令文件换行使用lf方式或者在terminal中对单个git代码仓库执行git config core.eol lf使用lf换行方式(这一步也可以不配置)
git config --global core.eol lf

// 提交时转换为lf,检出时不转换
git config --global core.autocrlf input

# 拒绝提交包含混合换行符的文件
git config --global core.safecrlf true

上面,最重要的一部是

git config --global core.autocrlf input

也可以只配置这个命令。

参考

Git操作中crlf和lf冲突问题