问题是: 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保留行结尾)。
答案 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