前置知识
LF
代表linux
风格的行尾字符\n
CRLF
代表windows
风格的行尾字符\r\n
发生原因
在提交代码的时候,git
检测到非当前系统设置的换行符,git
会将其进行转换。
如何解决?
通过设置git
的core.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
情况。
eol
是end of line
的缩写
疑问
git add --renormalize .
是用来干什么的?
也是用来让.gitattributes
立即生效的,不过该命令需要在git v2.16
或以上才行。
使用了.gitattributes后,git config core.autocrlf设定还会有效吗?
会覆盖
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。