Git回车换行
最近又个项目,checkout之后,没做任何改动前git status发现已经有modified了,通过git diff发现有两种改动:
- warning: CRLF will be replaced by LF in **
- 删除并添加的同样的行
使用git diff -w却没有改动;使用git diff –ws-error-highlight=new,old发现行尾有**^M**
我本人用的是Linux,其他同事有用Windows,问题就出在平台上。
Windows用CR LF来定义换行,Linux用LF。CR全称是Carriage Return ,或者表示为\r, 意思是回车。 LF全称是Line Feed,它才是真正意义上的换行表示符。
git config中关于CRLF有两个设定:core.autocrlf和core.safecrlf。
一、AutoCRLF
#提交时转换为LF,检出时转换为CRLF
git config –global core.autocrlf true
#提交时转换为LF,检出时不转换
git config –global core.autocrlf input
#提交检出均不转换
git config –global core.autocrlf false
二、SafeCRLF
#拒绝提交包含混合换行符的文件
git config –global core.safecrlf true
#允许提交包含混合换行符的文件
git config –global core.safecrlf false
#提交包含混合换行符的文件时给出警告
git config –global core.safecrlf warn
这种情况,把autocrlf置为false,safecrlf也置为false,可以忽略不同平台上回车换行的差异。
设置完成后,发现第二个问题还是存在。这时要查看代码库中是否存在.gitattributes文件,如果存在打开.gitattributes。
在该项目的.gitattributes中有几种设定:
- * text=auto !eol 所有带有text属性的文件使用auto的EOL,但是不指定EOL方式(CRLF or LF)
- [path]/file -text 取消文件的text属性
如果不指定EOL,git会使用config中的core.eol。如果未设置core.eol,git会使用平台默认的回车换行。
优先级 core.autocrlf > text=auto + core.eol。
以下设置的结果相同:
core.autocrlf=true
core.eol=CRLF 同时 * text=auto !eol
* text=auto CRLF
.gitattributes设置会影响checkout和checkin
最后的解决方案是直接清空了.gitattributes内容,这个问题应该是在项目从svn迁移到git时迁移工具自动添加的结果。