git diff muestra los colores incorrectamente

46

Para obtener resultados en color de todos los comandos git, configuro lo siguiente:

git config --global color.ui true

Sin embargo, esto produce una salida como esta para git diff,git log

captura de pantalla de git diff

mientras que los comandos como git statusmostrar bien

captura de pantalla de estado de git

¿Por qué no reconoce los códigos de color escapados en solo algunos de los comandos y cómo puedo solucionarlo?

Estoy usando iTerm 2 (tipo de terminal xterm-256color) en OS X 10.8.2 y zsh como mi shell

zsh --version
zsh 5.0.0 (x86_64-apple-darwin12.0.0)

git --version                                                                                                                      
git version 1.7.9.6 (Apple Git-31.1)
Gilles 'SO- deja de ser malvado'
fuente

Respuestas:

65

Estás viendo las secuencias de escape que le indican a la terminal que cambie los colores que se muestran con el carácter de escape que se muestra como ESC, mientras que el comportamiento deseado sería que las secuencias de escape tengan el efecto deseado.

Comandos como git diffy git logcanalizar su salida en un buscapersonas , lessde forma predeterminada. Git trata de decirle lessque permita que los personajes de control tengan su efecto de control, pero esto no funciona para usted.

Si lesses su localizador pero tiene la variable de entorno LESSestablecida en un valor que no incluye -ro -R, git no puede indicar lessque muestre colores. Normalmente pasa LESS=-FRSX, pero no si LESSya está configurado en el entorno. Una solución es pasar explícitamente la -Ropción de indicar lessque se muestren los colores cuando git lo invoca:

git config --global core.pager 'less -R'

Si lessno es su localizador, cambie lesso descubra cómo hacer que su localizador muestre colores.

Si no desea que git muestre colores cuando invoca un buscapersonas, configúrelo color.uien autolugar de true.

Gilles 'SO- deja de ser malvado'
fuente
Ah gracias. Si bien sabía que era lessnecesario -Rmostrar colores, lo olvidé git logy git difftransmití la salida a less. Gracias :)
55
¡Gracias! No me había dado cuenta de que el valor predeterminado ~/.profileen FreeBSD teníaPAGER=more; export PAGER
Jeffrey Goldberg el
Gracias. Me había LESSpropuesto -Kporque me gusta poder hacerlo CTRL-Ctodo. Pensé que era algo funky con esa variable, y ahora sé cómo solucionarlo.
trysis
2

Mejorando la respuesta de Gilles , puede mantener sus antiguas $LESSopciones al usar esto en su configuración de git (por ejemplo, en ~/.gitconfig):

[core]
pager = less -+$LESS -FRX
quazgar
fuente
La respuesta de Quazgar es buena. Tengo LESS=-ien mi bashrc, por lo que tendría que hacer `[core] pager = less $ LESS -FR` Saqué la X, porque con X, mi contenido de terminal existente se borra, prefiero que el contenido del terminal permanezca.
Wayne Walker
1

También puede ver esta salida si tiene Busybox . Alpine Linux es un buen ejemplo de una distribución popular que la usa. Ver https://wiki.alpinelinux.org/wiki/Alpine_Linux:FAQ#How_to_enable.2Ffix_colors_for_git.3F

Una manera simple de saber si actualmente usa Busybox es ejecutar:

realpath `which less`

O si usas concha de pescado

realpath (which less)

Si el resultado es /bin/busybox, entonces puede resolver su problema instalando menos GNU .

En alpino:

sudo apk --update add less

El comando será diferente dependiendo de su distribución / administrador de paquetes.

Christian Rondeau
fuente