前置知识
LF代表linux风格的行尾字符\nCRLF代表windows风格的行尾字符\r\n
发生原因
在提交代码的时候,git检测当前系统设置的换行符,将其转换,转换的规则由core.autocrlf的值决定。
如何解决?
通过设置git的core.autocrlf属性来解决。
接下来我们就来了解一下core.autocrlf,然后用来解决我们的问题。
如何读取当前git config core.autocrlf的设置?
git config core.autocrlf可能的值?
- true
拉取时:将LF转换为CRLF
提交时:将CRLF转换为LF - false
拉取时:什么都不做
提交时:什么都不做 - input
拉取时:什么都不做
提交时:将CRLF转换为LF
windows系统该怎么做?
windows上的换行是以CRLF结尾的,这条命令很契合。
git config core.autocrlf truelinux系统该怎么做?
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情况。
eol是end of line的缩写
疑问
git add --renormalize .是用来干什么的?
也是用来让.gitattributes立即生效的,不过该命令需要在git v2.16或以上才行。
使用了.gitattributes后,git config core.autocrlf设定还会有效吗?
会覆盖
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。