git diff отображает цвета неправильно

46

Чтобы получить цветной вывод всех команд git, я установил следующее:

git config --global color.ui true

Тем не менее, это производит вывод, как это для git diff,git log

скриншот git diff

в то время как команды вроде git statusотображаются нормально

скриншот состояния git

Почему он не распознает экранированные цветовые коды только в некоторых командах и как я могу это исправить?

Я использую iTerm 2 (тип терминала xterm-256color) на OS X 10.8.2 и zsh в качестве оболочки

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

git --version                                                                                                                      
git version 1.7.9.6 (Apple Git-31.1)
Жиль "ТАК - перестань быть злым"
источник

Ответы:

65

Вы видите escape-последовательности, которые сообщают терминалу об изменении цветов, отображаемых с символом escape, показанным как ESC, тогда как желаемым поведением было бы то, что escape-последовательности имеют ожидаемый эффект.

Такие команды, как git diffи git logтрубы их вывода в пейджер , lessпо умолчанию. Git пытается сказать, lessчтобы разрешить управляющим персонажам управлять ими, но это не работает для вас.

Если lessэто ваш пейджер, но у вас есть переменная окружения, для которой LESSзадано значение, которое не включает -rили -R, git не может сказать, lessчтобы отображать цвета. Это нормально проходит LESS=-FRSX, но не если LESSуже установлено в среде. Исправление состоит в том, чтобы явно передать -Rопцию, чтобы сказать lessотображать цвета при вызове git

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

Если lessэто не ваш пейджер, либо переключитесь, lessлибо выясните, как настроить отображение пейджера.

Если вы не хотите , мерзавца для отображения цветов , когда он вызова пейджера, установите color.uiна autoвместо true.

Жиль "ТАК - перестань быть злым"
источник
Ах, спасибо. Хотя я знал, что lessнужно -Rотображать цвета, я забыл об этом git logи git diffпередал вывод less. Спасибо :)
5
Спасибо! Я не заметил, что по умолчанию ~/.profileво FreeBSD былоPAGER=more; export PAGER
Джеффри Голдберг
Благодарю. Я LESSустановлен , -Kпотому что мне нравится быть в состоянии CTRL-Cвсе. Я подумал, что с этой переменной что-то странное, и теперь я знаю, как это исправить.
trysis
2

Улучшение ответа Gilles , вы можете сохранить свои старые $LESSопции, используя это в вашем git config (например, в ~/.gitconfig):

[core]
pager = less -+$LESS -FRX
quazgar
источник
Ответ квазгара хорош. У меня есть LESS=-iв моем bashrc, поэтому я должен был бы сделать `[core] pager = less $ LESS -FR` Я убрал X, потому что с X мой существующий контент терминала стирается, я предпочитаю, чтобы контент терминала оставался.
Уэйн Уокер
1

Вы также можете увидеть этот вывод, если у вас есть Busybox . Alpine Linux - хороший пример популярного дистрибутива, который его использует. См. Https://wiki.alpinelinux.org/wiki/Alpine_Linux:FAQ#How_to_enable.2Ffix_colors_for_git.3F.

Простой способ узнать, используете ли вы в настоящее время Busybox, это запустить:

realpath `which less`

Или если вы используете рыбные раковины

realpath (which less)

Если вывод /bin/busybox, то вы можете решить вашу проблему, установив GNU меньше .

На альпийском:

sudo apk --update add less

Команда будет отличаться в зависимости от вашего дистрибутива / менеджера пакетов.

Кристиан Рондо
источник