Как иметь git -diff игнорировать все пробелы-изменения, но ведущие?

В другом сообщении я нашел очень аккуратный

git diff --color-words='[^[:space:]]|([[:alnum:]]|UTF_8_GUARD)+'

который отлично справляется с сжатием вывода git-diff на существенное, оставаясь разборчивым (особенно при добавлении --word-diff=plain для дополнительных [-/-] и {+/+} окружающих делеций/дополнений). Хотя это включает изменения пробелов, выходной сигнал не выделяет их каким-либо заметным образом, например. при изменении отступа строки код (который является серьезным изменением) будет отображаться как эта строка с более длинным отступом (до или после), но не выделяется вообще.

Как изменения в пробелах могут быть правильно подсвечены, возможно, путем замены пробелов некоторыми символами юникода, такими как ·, и , или что-то более близкое к 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:]!