Как исправить строки исходного кода, отображающие ^ M с помощью «git diff», но с vim / gedit / cat -e выглядят нормально? - PullRequest
0 голосов
/ 14 февраля 2019

Я искал все выше и ниже всех, кто задавал подобные вопросы. не кажется простым случаем :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 ||<em><strong>^M</strong></em>
+           v == value33)<em><strong>^M</strong></em>
        {
              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

Ответы [ 2 ]

0 голосов
/ 15 февраля 2019

По умолчанию Git предполагает, что вы используете окончания строк Unix в репозитории, и выделяет возврат каретки как конечный пробел.Однако по умолчанию он выделяет конечные пробелы только на новых строках, поскольку цель состоит в том, чтобы избежать появления новых проблем.

Если вы запустите git diff --ws-error-highlight=all, вы увидите, что естьтакже возврат каретки по удаляемым строкам и по контекстным строкам.Если вы не хотите видеть это, вы можете установить core.whitespace на cr-at-eol, что предотвратит его выделение.Там нет никаких вредных последствий для этого;он просто не допускает, чтобы возврат каретки обрабатывался как конечный пробел.

Если вы планируете использовать этот проект в системах, отличных от Windows, вам следует преобразовать окончания строк в Unix и использовать файл .gitattributes, чтобы указатьатрибут text для текстовых файлов, поэтому конец строки автоматически преобразуется в зависимости от используемой операционной системы.Это может быть полезно, даже если ваш проект используется только в Windows, поскольку, если кто-то установил core.autocrlf, вы можете получить смешанные окончания строк.

0 голосов
/ 14 февраля 2019

Предполагается, что вы используете операционную систему Unix.Обычно с помощью команды vi или cat символы ^ M не видны.Вы можете увидеть, используя команду cat -v.Например.cat -v <имя_файла>

Чтобы избавиться от этих символов, используйте команду dos2unix.Например.dos2unix <имя_файла>

Это удалит эти символы ^ M и сохранит результат в том же самом файле.Таким образом, вам не нужно создавать временный файл для хранения содержимого промежуточного файла.

...