git diff wyświetla kolory nieprawidłowo

46

Aby uzyskać kolorowe wyjście ze wszystkich poleceń git, ustawiam następujące ustawienia:

git config --global color.ui true

Jednak daje to takie wyjście dla git diff,git log

zrzut ekranu git diff

podczas gdy polecenia takie jak git statuswyświetlanie dobrze

zrzut ekranu statusu git

Dlaczego nie rozpoznaje kodów kolorów, których nie można zmienić, tylko w niektórych poleceniach i jak mogę to naprawić?

Używam iTerm 2 (typ terminala xterm-256color) na OS X 10.8.2 i zsh jako moją powłokę

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- przestań być zły”
źródło

Odpowiedzi:

65

Widzisz sekwencje specjalne, które nakazują terminalowi zmianę kolorów wyświetlanych za pomocą znaku ucieczki pokazanego jako ESC, podczas gdy pożądanym zachowaniem byłoby, aby sekwencje specjalne miały zamierzony efekt.

Polecenia takie jak git diffi git logpotokuj swoje dane wyjściowe do pagera , lessdomyślnie. Git próbuje powiedzieć, lessaby umożliwić kontrolnym postaciom uzyskanie efektu kontrolnego, ale to nie działa dla ciebie.

Jeśli lessjest to pager, ale zmienna środowiskowa jest LESSustawiona na wartość, która nie obejmuje -rlub -R, git nie może lesswyświetlić kolorów. Zwykle przechodzi LESS=-FRSX, ale nie, jeśli LESSjest już ustawiony w środowisku. Poprawka polega na jawnym przekazaniu -Ropcji lesswyświetlania kolorów po wywołaniu przez git:

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

Jeśli lessnie jest to twój pager, przełącz się na lesslub dowiedz się, jak sprawić, by pager wyświetlał kolory.

Jeśli nie chcesz, aby git wyświetlał kolory podczas wywoływania pagera, ustaw color.uina autozamiast true.

Gilles „SO- przestań być zły”
źródło
Ach, dzięki. Chociaż wiedziałem, że lesstrzeba -Rwyświetlać kolory, zapomniałem o tym git logi git diffprzesłałem dane wyjściowe do less. Dzięki :)
5
Dziękuję Ci! Nie zauważyłem, że domyślny ~/.profilew FreeBSD miałPAGER=more; export PAGER
Jeffrey Goldberg
Dzięki. Miałem LESSustawione -Kbo jak jest w stanie CTRL-Cwszystkiego. Pomyślałem, że to coś dziwnego z tą zmienną i teraz wiem, jak to naprawić.
próbuje
2

Poprawiając odpowiedź Gillesa , możesz zachować swoje stare $LESSopcje, używając tego w konfiguracji git (na przykład w ~/.gitconfig):

[core]
pager = less -+$LESS -FRX
quazgar
źródło
odpowiedź quazgara jest dobra. Mam LESS=-iw moim bashrc, więc musiałbym zrobić „[rdzeń] pager = mniej $ MNIEJ -FR` Wyjąłem X, ponieważ z X, moja istniejąca zawartość terminala zostaje skasowana, wolę, aby zawartość terminala pozostała.
Wayne Walker
1

Możesz także zobaczyć to wyjście, jeśli masz Busybox . Alpine Linux jest dobrym przykładem popularnej dystrybucji, która go używa. Zobacz https://wiki.alpinelinux.org/wiki/Alpine_Linux:FAQ#How_to_enable.2Ffix_colors_for_git.3F

Prostym sposobem na sprawdzenie, czy obecnie używasz Busybox, jest uruchomienie:

realpath `which less`

Lub jeśli używasz skorupy ryb

realpath (which less)

Jeśli wynik jest /bin/busybox, możesz rozwiązać problem, instalując GNU mniej .

W Alpine:

sudo apk --update add less

Polecenie będzie się różnić w zależności od menedżera dystrybucji / pakietu.

Christian Rondeau
źródło