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中有几种设定:

  1. * text=auto !eol 所有带有text属性的文件使用auto的EOL,但是不指定EOL方式(CRLF or LF)
  2. [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时迁移工具自动添加的结果。

Comments

comments powered by Disqus