当文件的行结尾是正确的CRLF时,为什么git diff显示单独的CR?

时间:2015-01-03 11:45:05

标签: git cygwin

问题是: git diff显示单独的CR,但实际上没有。这是否意味着提交更改会导致麻烦?

$ git diff
index bla bla
--- a/filename
+++ b/filename
@@ etc
text
text
text
new text^M
text
text
text

我对此输出的解释是新行以CR-CR-LF结尾,而不是仅以CR-LF结尾,但事实并非如此。

以各种方式检查文件表明新文本具有正确的CR-LF对,就像do之前和之后的行一样。例如,使用hexdump检查文件会在整个过程中显示正确的CR-LF对。

“^ M”显示某些但不是所有挂起的更改。当存在“^ M”时,它将附加到更改的每个“新”行。这个项目中所有文件的所有行都以CR-LF结尾,它只是git diff错误显示的一些最近的更改。这不是一个虚假的git状态问题;与git状态中未分级更改一起出现的唯一文件是合法更改的。

所有git的与换行相关的配置选项都处于默认设置。我将强调,尽管将来可能会做得很好,但我没有将core.autocrlf设置为true,因为显然建议使用Windows。前10次提交没有这样的问题,配置选项也一直都是一样的。

本地没有.gitattributes文件。还没有远程仓库,所以也没有.gitattributes。这可以通过使用git check-attributes检查文件上可能设置的属性来确认,git check-attributes对显示此问题的文件根本不输出任何属性。再次前面的10次提交没有出现“^ M”在diff中毫无理由地弹出的问题。

我经常在提交之前检查我的“git diff”,以防我可能更喜欢做“git add -p”并将其他更改与其他更改分开,或者可能不提交我可能暂时添加的额外嘈杂日志行。这就是我此时注意到麻烦的git diff输出的方法。

我可能希望将我的代码推送到GitHub并将我的代码暴露给批评,所以如果我能说服“git diff”一切都很好,如果事实上一切都很好的话会很好。

环境是Cygwin在12/27/14左右更新,使用来自Cygwin的GIT,文件系统安装为“二进制”(这是一个Cygwin保留行结尾)。

2 个答案:

答案 0 :(得分:1)

初始条件:

已对文件进行了更改。文件具有CRLF行结尾。 " git diff"似乎很困惑。

步骤1:使用" git difftool -x" / usr / bin / diff -u"生成补丁-y>补丁文件

步骤2:添加配置如下(部分git config -l输出)

core.autocrlf=false
core.eol=lf

第3步:git checkout - any_changed_file

- >此时,编辑的唯一副本位于步骤1的补丁文件中

步骤4:将所有文件更改为LF行结尾并提交相同的内容。

步骤5:将补丁中的所有行结尾从步骤1更改为LF。

步骤6:应用步骤1中的补丁

- >补丁索引线看起来有点毛茸茸,但补丁实用程序不会感到困惑。

此时,回购中的blob和要应用的更改采用GIT喜欢的格式。现在可以遵循正常的过程来提交更改。在我的情况下,我一直在单独提交单独的更改,所以我不得不使用git add -p然后提交几轮。

后续步骤:确保将Eclipse / YourEditor配置为在将来创建具有LF行结尾的新文件。如果无法以这种方式配置,那么摆脱编辑器。一个主要的,相当流行的IDE(NOT Notepad)不得不被丢弃,因为我发现它只做了#34; native"行结尾,这意味着我无法使用它来编写bash脚本。

暂时,GIT中有无证的启发式方法与3或4个GIT配置设置交互以产生GIT的行为,而简单,非细微的情况是当所有内容都适合LF线路结束时。

答案 1 :(得分:-1)

默认情况下,Git假定一行为0或更多字符,后跟换行符 (如果)。当您使用回车符,换行符(CRLF)行结尾时,Git会看到这一点 作为文件的更改。所以当你看到

时就差一点了
new text^M
text

您所看到的是CR(^ M)的表示,后跟文字LF。 如果LF不存在,你会看到这个

new text^Mtext

解决这些问题的最佳方法是简单地使用LF行结尾 你的所有文件。所有现代文本编辑器(阅读:不是记事本)都支持这一点。 但是,如果您不能或不会这样做,您可以将此添加到您的 ~/.gitconfig

[core]
whitespace = cr-at-eol