Git Diff zeigt Farben falsch an

46

Um eine farbige Ausgabe von allen Git-Befehlen zu erhalten, habe ich Folgendes festgelegt:

git config --global color.ui true

Dies erzeugt jedoch eine Ausgabe wie diese für git diff,git log

Git Diff Screenshot

wohingegen Befehle wie git statusAnzeige in Ordnung sind

Git-Status-Screenshot

Warum werden die maskierten Farbcodes in einigen Befehlen nicht erkannt und wie kann ich das beheben?

Ich verwende iTerm 2 (Terminaltyp xterm-256color) unter OS X 10.8.2 und zsh als 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 - hör auf böse zu sein'
quelle

Antworten:

65

Sie sehen die Escape-Sequenzen, die das Terminal anweisen, die Farben zu ändern, wobei das Escape-Zeichen als angezeigt wird ESC, wohingegen das gewünschte Verhalten darin besteht, dass die Escape-Sequenzen den beabsichtigten Effekt haben.

Befehle wie git diffund git logRohr ihren Ausgang in einen Pager , lessstandardmäßig. Git versucht zu sagen less, dass Steuerzeichen ihre Steuerwirkung haben sollen, aber das funktioniert bei Ihnen nicht.

Wenn lessIhr Pager aber die Umgebungsvariable LESSauf einen Wert gesetzt ist, der -roder nicht enthält -R, kann git nicht sagen less, welche Farben angezeigt werden sollen. Es passiert normalerweise LESS=-FRSX, aber nicht, wenn LESSes bereits in der Umgebung eingestellt ist. Ein Fix besteht darin, die -ROption explizit zu übergeben, um anzugeben less, dass Farben angezeigt werden sollen, wenn sie von git aufgerufen werden:

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

Wenn dies lessnicht Ihr Pager ist, wechseln Sie zu lessoder finden Sie heraus, wie Sie die Anzeigefarben Ihres Pagers ändern können.

Wenn Sie nicht git Anzeigefarben werden soll , wenn es einen Pager Aufruf gesetzt color.uizu autostatt true.

Gilles 'SO - hör auf böse zu sein'
quelle
Ah danke. Während ich das wusste lessbenötigt , -Rum die Anzeigefarben, ich habe vergessen , dass git logund git diffverrohrt Ausgang less. Vielen Dank :)
5
Danke! Ich hatte nicht bemerkt, dass der Standard ~/.profilein FreeBSD hattePAGER=more; export PAGER
Jeffrey Goldberg
Vielen Dank. Ich hatte mich darauf LESSeingestellt, -Kweil ich es mag, zu CTRL-Callem fähig zu sein . Ich dachte, es wäre etwas Irres mit dieser Variablen, und jetzt weiß ich, wie ich es beheben kann.
Trysis
2

Indem Sie Gilles ' Antwort verbessern , können Sie Ihre alten $LESSOptionen beibehalten, indem Sie diese in Ihrer Git-Konfiguration verwenden (zum Beispiel in ~/.gitconfig):

[core]
pager = less -+$LESS -FRX
Quazgar
quelle
Die Antwort von Quazgar ist gut. Ich habe LESS=-iin meinem bashrc, also müsste ich "[core] pager = less $ LESS -FR" machen. Ich habe das X entfernt, weil mit X mein vorhandener Terminalinhalt gelöscht wird. Ich bevorzuge, dass der Terminalinhalt bleibt.
Wayne Walker
1

Sie können diese Ausgabe auch sehen, wenn Sie über eine Busybox verfügen . Alpine Linux ist ein gutes Beispiel für eine beliebte Distribution, die es verwendet. Siehe https://wiki.alpinelinux.org/wiki/Alpine_Linux:FAQ#How_to_enable.2Ffix_colors_for_git.3F

Eine einfache Möglichkeit, festzustellen, ob Sie derzeit Busybox verwenden, besteht darin, Folgendes auszuführen:

realpath `which less`

Oder wenn Sie Fisch Schale

realpath (which less)

Ist dies der Fall /bin/busybox, können Sie Ihr Problem lösen, indem Sie gnu less installieren .

Auf Alpine:

sudo apk --update add less

Der Befehl ist je nach Distribution / Paketmanager unterschiedlich.

Christian Rondeau
quelle