git diff exibe cores incorretamente

46

Para obter uma saída colorida de todos os comandos git, defino o seguinte:

git config --global color.ui true

No entanto, isso produz uma saída como essa para git diff,git log

captura de tela git diff

enquanto comandos como git statusexibir bem

captura de tela do status git

Por que ele não reconhece os códigos de cores de escape em apenas alguns dos comandos e como posso corrigi-lo?

Estou usando o iTerm 2 (tipo de terminal xterm-256color) no OS X 10.8.2 e zsh como meu 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- parar de ser mau'
fonte

Respostas:

65

Você está vendo as seqüências de escape que dizem ao terminal para alterar as cores exibidas com o caractere de escape mostrado como ESC, enquanto o comportamento desejado seria que as seqüências de escape tenham o efeito pretendido.

Comandos como git diffe git logcanalizam sua saída em um pager , lesspor padrão. O Git tenta dizer lesspara permitir que os caracteres de controle tenham seu efeito de controle, mas isso não está funcionando para você.

Se lessé o seu pager, mas você tem a variável de ambiente LESSdefinida como um valor que não inclui -rou -R, o git não pode dizer lesspara exibir cores. Normalmente passa LESS=-FRSX, mas não se LESSjá estiver definido no ambiente. Uma correção é passar explicitamente a -Ropção para dizer lesspara exibir cores quando invocado pelo git:

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

Se lessnão for o seu pager, alterne para lessou descubra como fazer com que o pager exiba cores.

Se você não quiser que o git exiba cores quando estiver chamando um pager, defina color.uicomo em autovez de true.

Gilles 'SO- parar de ser mau'
fonte
Ah obrigada. Embora eu soubesse que lessprecisava -Rexibir cores, esqueci isso git loge git diffcanalizei a saída para less. Obrigado :)
5
Obrigado! Eu não tinha notado que o padrão ~/.profileno FreeBSD tinhaPAGER=more; export PAGER
Jeffrey Goldberg
Obrigado. Eu tinha LESSdefinido -Kporque eu gosto de ser capaz de CTRL-Ctudo. Eu pensei que era algo estranho com essa variável, e agora eu sei como consertá-la.
trysis
2

Melhorando a resposta do Gilles , você pode manter suas $LESSopções antigas usando isso na sua configuração do git (por exemplo, em ~/.gitconfig):

[core]
pager = less -+$LESS -FRX
quazgar
fonte
A resposta de Quazgar é boa. Eu tenho LESS=-ino meu bashrc, então eu teria que fazer `[core] pager = less $ LESS -FR` Eu tirei o X, porque com X, meu conteúdo do terminal existente é apagado, eu prefiro que o conteúdo do terminal permaneça.
Wayne Walker
1

Você também pode ver esta saída se tiver o Busybox . O Alpine Linux é um bom exemplo de uma distribuição popular que a utiliza. Consulte https://wiki.alpinelinux.org/wiki/Alpine_Linux:FAQ#How_to_enable.2Ffix_colors_for_git.3F

Uma maneira simples de saber se você atualmente usa o Busybox é executar:

realpath `which less`

Ou se você usa casca de peixe

realpath (which less)

Se a saída for /bin/busybox, então você pode resolver seu problema instalando menos o gnu .

No Alpine:

sudo apk --update add less

O comando será diferente dependendo da sua distribuição / gerenciador de pacotes.

Christian Rondeau
fonte