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

wal*_*lyk 0 linux git vim carriage-return

我到处寻找问类似问题的人。这似乎不是:set fileformat=dos一个简单的or的情况:set fileformat=unix

将文件写出并:set fileencoding=latin1进行:set fileformat=dos更改,以便git diff报告所有行都附加了 ^M。

该代码最初很高兴地存在为:

...
if (v == value32S)
{
...
Run Code Online (Sandbox Code Playgroud)

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

...
if (v == value32S ||
    v == value33)
{
...
Run Code Online (Sandbox Code Playgroud)

git diff要检查错误的更改显示:

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

#如果CONFIG_1 || 配置_2

- if (v == value32S)
+ if (v == value32S || ^M 
+ v == value33) ^M
        {
              做某事(new_v);

其中粗体斜体文本是反相视频。

我尝试了多种方法来消除明显的虚假回车符。首先是确保没有隐藏角色。查看方式vim :set list

...
if (v == value32S ||$
    v == value33)$
{$
...
Run Code Online (Sandbox Code Playgroud)

看起来不错。转储文件(为了保护 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).. |
Run Code Online (Sandbox Code Playgroud)

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

$ cat -e c.cpp

...
if (v == value32S ||^M$
    v == value33)^M$
{^M$
...
Run Code Online (Sandbox Code Playgroud)

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

$ file csettings.cpp
csettings.cpp:  C source, UTF-8 Unicode text, with CRLF line terminators
Run Code Online (Sandbox Code Playgroud)

有趣的是,这是该目录(头文件和 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
Run Code Online (Sandbox Code Playgroud)

bk2*_*204 6

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

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

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