Colorear espacios en blanco en la salida de git-diff

151

En cuanto al formato de código, soy un poco purista :). A menudo elimino espacios en blanco innecesarios (líneas con solo ws, ws al final de las líneas, etc.). Incluso he configurado vim para mostrar ese tipo de líneas de color rojo.

Mi problema es que usando git-diff a menudo veo algo como esto:

-      else{ 
+      else{

Incluso si tengo color de git-diff no puedo ver la diferencia (en esa situación particular eliminé 1 ws al final de la línea). ¿Hay alguna manera de decirle a git-diff que muestre que estaba coloreado de rojo? (por ejemplo, aquellos que coinciden con / \ s + $ / regexp).

radarek
fuente
44
Si invierte los colores (intercambiar el primer plano y el fondo), aparecerán cambios en el espacio en blanco como este. Una manera fácil de lograr esto en muchas terminales es resaltar el texto en cuestión con el mouse. Este truco solo funciona con una diferencia de color, por supuesto.
Phlarx

Respuestas:

172

Es posible que deba establecer la configuración de configuración color.diff.whitespace, por ejemplo, con:

 git config color.diff.whitespace "red reverse"

(Supongo que ya tiene color.diffo color.uiconfiguró autoya que dice que ve parches de colores de git difftodos modos).

Si desea ajustar el tipo de errores de espacios en blanco que están resaltados en rojo, puede cambiar core.whitespace, pero blank-at-eolestá habilitado de forma predeterminada, por lo que probablemente no necesite cambiar eso para el ejemplo que menciona.

Una posible fuente de confusión es que en la salida de git diff, los errores de espacios en blanco solo se resaltan en las líneas que se introducen, no en las que se eliminan. ( Actualización: como señala Paul Whittaker en su respuesta , que debería votar arriba :), puede ver esto invirtiendo el sentido de la diferencia con git diff -R).

Puede encontrar más documentación sobre estas opciones de configuración en la página del manual de configuración de git

Si no desea usar -Rkludge, puede usar la opción de resaltado de error de espacio en blanco en la página del manual de diferencias .

--ws-error-highlight =

Resalte los errores de espacios en blanco en las líneas especificadas por en el color especificado por color.diff.whitespace. es una lista separada por comas de contexto antiguo, nuevo. Cuando no se proporciona esta opción, solo se resaltan los errores de espacios en blanco en las nuevas líneas. Por ejemplo, --ws-error-highlight = nuevo, antiguo resalta los errores de espacio en blanco en las líneas eliminadas y agregadas. todo se puede usar como una abreviatura para el contexto antiguo, nuevo.

git diff --ws-error-highlight=new,old <file>

o

git diff --ws-error-highlight=all <file>

No conozco una manera de activar esto permanentemente y almacenarlo en configuración aparte de usar un alias:

git config alias.df 'diff --ws-error-highlight=all'

Ahora puedes usar:

git df <file>

Para ver los cambios en rojo.

Tenga en cuenta que con Git 2.11 (Q4 2016) , este alias podría reemplazarse con:

git config diff.wsErrorHighlight all

Ver docgit diff y engit config .

Mark Longair
fuente
33
"Una posible fuente de confusión es que en la salida de git diff, los errores de espacios en blanco solo se resaltan en las líneas que se introducen, no en las que se eliminan". ¡Exactamente! ¿Y no hay forma de mostrarlo también para las líneas eliminadas? (hey, es diff :))
radarek
66
Agregue --global para configurar en su ~ / .gitconfig
simlmx
17
@radarek: puede usar la opción inversa:git diff -R
azulado
66
¿Hay un informe de error para esto? Si no, parece que debería haberlo.
Ajedi32
3
Esto funcionó git config diff.wsErrorHighlight all. Se usa git config --global [...]para hacer los cambios globales (es decir, que afectan a todos los repositorios).
Felipe Alvarez
141

Use git diff -Rpara convertir las líneas eliminadas en líneas agregadas. Luego se resaltará el espacio en blanco al final.

(Esto supone que ya tiene activada la iluminación de espacios en blanco, según la configuración de color de la respuesta de Mark. El crédito para este método va a la publicación de Junio ​​en http://git.661346.n2.nabble.com/Highlighting-whitespace-on-removal- with-git-diff-td5653205.html .)

Por ejemplo, al convertir un archivo de terminaciones de línea de DOS a Unix, git diff -Rme muestra claramente los ^Mcaracteres (dis) que aparecen al final de las líneas. Sin -R(y también sin -wetc.) muestra que todo el archivo ha cambiado, pero no muestra cómo.

Paul Whittaker
fuente
44
Por supuesto, también puede hacerlo git diff | cat -A | less -Ssi está desesperado, pero además de los retornos de carro, cattambién mostrará cualquier color resaltando los códigos de escape literalmente.
Paul Whittaker
3
@Paul_Whittaker cat -Ano es portátil. En el gato BSD, no existe tal opción. Por favor, use cat -veten su lugar.
7heo.tk
9

Uso git diff --color | less -R. Esto -Rhace que los códigos de control de color sean amigables para los humanos.

Entonces puede usar lessla búsqueda de expresiones regulares, por ejemplo

/[[:space:]]+$
Kelvin
fuente
Esta expresión regular también funciona vim, por cierto.
Jose Alban
Esta última idea less -Rsimplemente me facilitó el ls --colorpaso less.
Menachem
0

Mi versión de git diffya parece hacer esto: tengo git 1.7.4.1 y lo he configurado color.ui = auto.

nickgrim
fuente
12
Acabo de probar con git 1.7.5.1 y ciertamente no resalta el espacio en blanco al final de las líneas que se eliminan.
Infiltrator