如何修复更改的源代码行显示^ M与“git diff”,但用vim / gedit / cat -e看起来很好?

问题描述 投票:0回答:2

对于提出类似问题的人,我搜索过高低。它似乎不是:set fileformat=dos:set fileformat=unix的简单案例。

使用:set fileencoding=latin1:set fileformat=dos编写文件时,git diff报告所有行都附加了^ M.

代码原本很高兴存在:

...
if (v == value32S)
{
...

我做了非常彻底的改进(在vim的屏幕上看起来很好):

...
if (v == value32S ||
    v == value33)
{
...

git diff检查错误的变化显示:

diff --git a/csettings.cpp b/csettings.cpp
index 1234..8901 100755
--- a/csettings.cpp
+++ b/csettings.cpp
@@ -2466,7 +2466,8 @@ bool MyClass::settingIsValid(QString s)

#if CONFIG_1 || CONFIG_2

-       if (v == value32S)
+       if (v == value32S ||^M
+           v == value33)^M
        {
              doSomething(new_v);

粗体斜体文本是反向视频。

我已经尝试了几种方法来使显然虚假的回车消失。首先要确保没有隐藏的角色。查看与vim :set list

...
if (v == value32S ||$
    v == value33)$
{$
...

看起来很好。转储文件(微细条目有所不同,以保护NDA,我懒得让它成为一个完美的欺骗):

$ hd csettings.cpp
(...)
0000eae0 xx xx xx xx xx xx xx xx  xx 65 33 32 53 20 7c 7c  |(v == value32S |||
0000eaf0 0d 0a 20 20 20 20 20 20  20 20 20 20 20 20 76 20  |..             v |
0000eb00 3d 3a 20 xx xx xx xx xx  xx 65 33 33 29 0d 0a 20  |== ...value33).. |

所有其他行也以“0d 0a”结尾,所以这看起来很好。一个有趣的建议是使用cat -e(这对我来说是新的):

$ cat -e c.cpp

...
if (v == value32S ||^M$
    v == value33)^M$
{^M$
...

另一个建议是使用file作为线索:

$ file csettings.cpp
csettings.cpp:  C source, UTF-8 Unicode text, with CRLF line terminators

有趣的是,这是此目录(头文件和cpp代码)中唯一不是ASCII text的文件。有些文件有CRLF行终止符,有些文件没有。此外,一些显示C++ source和其他是C source,我认为是不重要的。

删除文件和git checkout以获得一个新的副本也显示为UTF-8,我追溯到某些字符串中的度数符号(“°F”和“°C”)所以UTF-8似乎不是一个问题。

不过,我不明白为什么使用vim只编辑这些行会导致这个问题。或者也许这不是问题?有任何想法吗?

-----附录-----

git config --get-regexp core.*表明

core.repositoryformatversion 0
core.filemode true
core.bare false
core.logallrefupdates true
linux git vim carriage-return
2个回答
3
投票

默认情况下,Git假定您在存储库中使用Unix行结尾并将回车突出显示为尾随空格。但是,默认情况下,它仅在新行上突出显示尾随空格,因为目标是避免引入新问题。

如果你运行git diff --ws-error-highlight=all,你会发现在被删除的行和上下文行上也有回车符。如果你不想看到这个,你可以将core.whitespace设置为cr-at-eol,这将阻止它被突出显示。对此没有任何不良影响;它只是防止回车被视为尾随空格。

如果您计划在非Windows系统上使用此项目,则应将行结尾转换为Unix并使用.gitattributes文件指定文本文件的text属性,以便根据正在使用的操作系统自动转换行结尾。即使您的项目仅在Windows上使用,这可能也很有价值,因为如果某人设置了core.autocrlf,您最终可能会出现混合行结尾。


0
投票

假设您使用的是基于unix的操作系统。通常使用vi或cat命令,^ M字符不可见。你可以看到使用cat -v命令。例如。 cat -v <file_name>

要删除这些字符,请使用dos2unix命令。例如。 dos2unix <file_name>

这将删除那些^ M个字符并将结果保存在同一个文件中。因此,您不必创建任何临时文件来存储中间文件内容。

© www.soinside.com 2019 - 2024. All rights reserved.