Как иметь git -diff игнорировать все пробелы-изменения, но ведущие?
В другом сообщении я нашел очень аккуратный
git diff --color-words='[^[:space:]]|([[:alnum:]]|UTF_8_GUARD)+'
который отлично справляется с сжатием вывода git-diff
на существенное, оставаясь разборчивым (особенно при добавлении --word-diff=plain
для дополнительных [-
/-]
и {+
/+}
окружающих делеций/дополнений). Хотя это включает изменения пробелов, выходной сигнал не выделяет их каким-либо заметным образом, например. при изменении отступа строки python код (который является серьезным изменением) будет отображаться как эта строка с более длинным отступом (до или после), но не выделяется вообще.
Как изменения в пробелах могут быть правильно подсвечены, возможно, путем замены пробелов некоторыми символами юникода, такими как ·
, ⇥
и ↵
, или что-то более близкое к git diff --word-diff-regex=.
{+ +}
и т.д., но с более умным словом разделение?
Ответы
Ответ 1
Здесь альтернатива, использующая подстановку, предложенную в конце вопроса:
git config --global core.pager 'less --raw-control-chars'
чтобы символы юникода отображались правильно, а не какой-то странный вывод <c3>
ish. Добавьте в конфигурацию git следующее:
[diff "txt"]
textconv = unwhite.sh
и, не имея глобального решения, .gitattributes
что-то вроде
*.py diff=txt
Наконец, unwhite.sh
:
#!/bin/bash
awk 1 ORS='[7m\\n[27m\n' $1 | sed -e 's/ /␣/g' -e 's/\t/→/g'
Сообщаем, что есть сырые побеги (awk
не поддерживает символы \e
) до [
s, я отображаю символ новой строки \n
в инвертированные цвета, чтобы отличать их от буквального \n
s. Этот может не копировать вставку, и в этом случае вам, возможно, придется вручную вставить их. Или попробуйте удачу с символом unicode, например ↵
.
Я отклонился от исходных символов Юникода, так как они не отображались правильно на msysgit.
Ответ 2
Я не мог решить вашу проблему, но я беспокоюсь, что Git может работать против вас здесь. Напомним, что --color-words=<regex>
представляет собой комбинацию --word-diff=color
и --word-diff-regex=<regex>
. Документация man git diff
гласит:
--word-diff-regex=<regex>
Use <regex> to decide what a word is, instead of considering runs
of non-whitespace to be a word. Also implies --word-diff unless it
was already enabled.
Every non-overlapping match of the <regex> is considered a word.
Anything between these matches is considered whitespace and
ignored(!) for the purposes of finding differences. You may want
to append |[^[:space:]] to your regular expression to make sure
that it matches all non-whitespace characters. A match that
contains a newline is silently truncated(!) at the newline.
The regex can also be set via a diff driver or configuration
option, see gitattributes(1) or git-config(1). Giving it
explicitly overrides any diff driver or configuration setting.
Diff drivers override configuration settings.
Обратите внимание на эту часть среднего абзаца: " Все, что между этими совпадениями считается пробельным и игнорируется (!) для поиска различий." Итак, похоже, что Git пытается обработать здесь есть пробелы, и это может быть проблемой.
Ответ 3
Лучшее, что я могу сделать до сих пор, -
git diff --color-words='[[:space:]]|([[:alnum:]]|UTF_8_GUARD)+' --word-diff=plain
Обратите внимание на удаленный ^
перед [:space:]
!