前置知识

LF代表linux风格的行尾字符\n
CRLF代表windows风格的行尾字符\r\n

发生原因

在提交代码的时候,git检测到非当前系统设置的换行符,git会将其进行转换。

如何解决?

通过设置gitcore.autocrlf属性来解决。
接下来我们就来了解一下core.autocrlf,然后用来解决我们的问题。

如何读取当前git config core.autocrlf的设置?

git config core.autocrlf

可能的值?

  • true
    提交时:将CRLF转换为LF
    拉取时:将LF转换为CRLF
  • false
    提交时:什么都不做
    拉取时:什么都不做
  • input
    提交时:将CRLF转换为LF
    拉取时:什么都不做

windows系统该怎么做?

windows上的换行是以CRLF结尾的,这条命令很契合。

git config core.autocrlf true

linux系统该怎么做?

linux上的换行是以LF结尾的,这条命令很契合。

git config core.autocrlf input

项目中有windows和linux的开发人员该怎么做?

一般的代码托管服务器都是linux系统,所以我们的目标是这样:
无论你的开发人员是什么系统,以什么换行结尾,到了代码托管系统,统一以linux为标准,也就是LF结尾。

windows用户设置

git config core.autocrlf true

linux用户设置

git config core.autocrlf input

但是,上述的操作不太可控,比如项目里面成员有很多,我不可能挨个去叮嘱并检查他们的设置。有没有更好的办法呢?
有,借助.gitattributes

在项目的根目录下添加一个.gitattributes文件,内容如下:

// .gitattributes
# 将自己期望的文件类型的行尾设置为lf(我曾经的错误的将`text`前面加上了星号,这导致我的图片文件被破坏)
*.js   text eol=lf
*.json text eol=lf
*.css  text eol=lf

上面的配置,意味着无论在什么操作系统上,当你检出文件时,所有的行结束符都会被转换为LF。这样可以确保在不同操作系统之间进行协作时,文件的行结束符始终保持一致。(别人对文件修改,并且你拉取时才会生效)

如果想要立即修改本地文件的eof,需要执行下面的命令(请保证文件已经commit):

git rm --cached -r .
git reset --hard

然后可以用git ls-files --eol命令查看文件的eol情况。

eolend of line的缩写

疑问

git add --renormalize .是用来干什么的?

也是用来让.gitattributes立即生效的,不过该命令需要在git v2.16或以上才行。

使用了.gitattributes后,git config core.autocrlf设定还会有效吗?

会覆盖
image.png

资料

configuring-git-to-handle-line-endings


热饭班长
3.7k 声望434 粉丝

先去做,做出一坨狗屎,再改进。