¿Cómo hacer que git-diff ignore todos los cambios de espacio en blanco pero liderando uno?

En otra publicación encontré el muy orderado

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

que hace un gran trabajo al comprimir la salida de git-diff en lo esencial mientras permanece legible (especialmente cuando se agrega --word-diff=plain para [- / -] y {+ / +} eliminaciones / adiciones circundantes. Si bien esto incluye cambios de espacio en blanco, la salida no los resalta de manera notable, por ejemplo, al cambiar la sangría de una línea de código de python (que es un cambio grave) aparecerá como esa línea con la sangría más larga (antes o después ), pero no hay resaltar en absoluto.

¿Cómo se pueden resaltar correctamente los cambios en el espacio en blanco, quizás reemplazando los espacios en blanco por algunos caracteres unicode, como · , y , o algo más parecido a git diff --word-diff-regex=. ¿Tiene {+ +} etc. pero con la separación de palabras más inteligente?

No pude resolver tu problema, pero me preocupa que Git pueda estar trabajando en contra de ti aquí. Recuerde que --color-words=<regex> es una combinación de --word-diff=color y --word-diff-regex=<regex> . La documentation de man git diff dice:

  --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 considenetworking a word. Anything between these matches is considenetworking whitespace and ignonetworking(!) 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. 

Observe esta parte del párrafo del medio: " Cualquier cosa entre estas coincidencias se considera espacio en blanco e ignorado (!) Con el propósito de encontrar diferencias " . Entonces, parece que Git intenta tratar el espacio en blanco especialmente aquí, y eso podría ser un problema.

Lo mejor que puedo get hasta ahora es

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

Tenga en count el eliminado ^ frente a [:space:] !

Aquí hay una alternativa que utiliza la sustitución sugerida al final de la pregunta:

 git config --global core.pager 'less --raw-control-chars' 

de modo que los símbolos Unicode se muestren correctamente en lugar de algún extraño resultado de <c3> ish. Agregue lo siguiente a su configuration de git:

 [diff "txt"] textconv = unwhite.sh 

y, careciendo de una solución global , para .gitattributes algo como

 *.py diff=txt 

Finalmente, unwhite.sh :

 #!/bin/bash awk 1 ORS='[7m\\n[27m\n' $1 | sed -e 's/ /␣/g' -e 's/\t/→/g' 

Tenga en count que hay caracteres de escape sin procesar ( awk no admite \e ) antes de que [ s, muestre la nueva línea-que indica \n en colors invertidos para que difieran de los caracteres literales \n s. Es posible que no se copie el pegado, en cuyo caso puede que tenga que insertlos manualmente. O testing tu suerte con un símbolo Unicode como lugar.

Me desvié de los símbolos Unicode originales porque no se podían mostrar correctamente en msysgit.