Jak pokolorować wyjście git?

255

Czy istnieje sposób na kolorowe wyjście dla git (lub dowolnego polecenia)?

Rozważać:

baller@Laptop:~/rails/spunky-monkey$ git status
# On branch new-message-types
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       modified:   app/models/message_type.rb
#
no changes added to commit (use "git add" and/or "git commit -a")
baller@Laptop:~/rails/spunky-monkey$ git add app/models

I

baller@Laptop:~/rails/spunky-monkey$ git status
# On branch new-message-types
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       modified:   app/models/message_type.rb
#

Dane wyjściowe wyglądają tak samo, ale informacje są zupełnie inne: plik został zmieniony ze sceny niestacjonarnej na etapową w celu zatwierdzenia.

Czy istnieje sposób pokolorowania wydruku? Na przykład pliki, które nie są etapowane, są czerwone, a etapowe zielone?

A może nawet Changes not staged for commit:czerwony i # Changes to be committed:zielony?

Praca w Ubuntu.

EDIT: googlowania uznało tę odpowiedź, która działa świetnie: git config --global --add color.ui true.

Czy istnieje jednak bardziej ogólne rozwiązanie dodawania koloru do wyniku polecenia?

B Seven
źródło
1
Chcesz czegoś, co pokoloruje wszystkie wyjścia poleceń? Skąd miałby wiedzieć, które części pokolorować?
Michael Mrozek
Sądzę, że istniał sposób skonfigurowania go za pomocą wyrażenia regularnego: każdy kolor może mieć wyrażenie początkowe. I może istnieć domyślny regex koloru, aby wyłączyć wszystkie kolory. A jeśli pojawi się tekst „foo”, wyświetl go w określonym kolorze ...
B Siedem

Odpowiedzi:

268

Możesz utworzyć [color]w swoim dziale ~/.gitconfignp. Następującą treść

[color]
  diff = auto
  status = auto
  branch = auto
  interactive = auto
  ui = true
  pager = true

Możesz także dokładnie kontrolować, w jaki sposób chcesz pokolorować, w jaki sposób, np

[color "status"]
  added = green
  changed = red bold
  untracked = magenta bold

[color "branch"]
  remote = yellow

Mam nadzieję, że dzięki temu zaczniesz. I oczywiście potrzebujesz terminalu obsługującego kolor.

Marco
źródło
14
Myślę, że warto umieścić git config --global color.ui auto (odpowiedź @Evgeny) na szczycie twojego ... Myślę, że prawdopodobnie tego właśnie szuka większość ludzi. Głosowałem za obiema ... Mówię tylko, że ze względu na Internet, który się tu pojawia, myślę, że wiele osób chce tylko tego prostego linera. Tym lepiej, jeśli go dostaną, plus twoją dodatkową dobroć.
msouth
To działało idealnie dla mnie - w [color "status"]sekcji, którą dodałem branch = yellow.
Wayne Werner
3
możesz także dodać sekcję [kolor] do pliku .git / config projektu
andrej
I możesz po prostu ustawić zmienną konfiguracyjną dla pojedynczego wywołania polecenia git: stackoverflow.com/a/18304605/134044
NeilG
220

Prawdopodobnie chcesz użyć

git config --global color.ui auto

autoCzęść mówi, że będzie git tylko próbować i używać kolorów na terminalach, które go obsługują, a nie dostaniesz sekwencje ANSI jeśli przekierować dane wyjściowe komendy git do pliku np. Ustawienie go truejest takie samo jak autoi jest to również ustawienie domyślne od wersji Git 1.8.4.

color.uiJest meta konfiguracja, która obejmuje wszystkie różne color.*konfiguracje dostępnych za pomocą poleceń git.

Wyjaśniono to szczegółowo w git help config.

Jewgienij
źródło
Czy potrafisz wyjaśnić różnicę między color.ui true(który autowskazuje) a always? Czytam dokumenty, ale wciąż nie rozumiem różnicy.
chharvey
19
git config --global color.ui auto
git config --global color.branch auto
git config --global color.status auto
sakisk
źródło
Do twojej wiadomości, tylko to działało dla gita w wersji 1.5.2.1, inne odpowiedzi nie.
AbhiNickz,
14

Przyjęta odpowiedź daje najczęstsze rozwiązanie. Jeśli z jakiegokolwiek powodu nie musisz trwale zmieniać konfiguracji, co robi to rozwiązanie, możesz zastąpić konfigurację dla pojedynczego polecenia git:

git -c color.ui=always <usual git command and options>

Na przykład:

git -c color.ui=always status
git -c color.ui=always diff

Testowane: obsługiwane na git 2.4.6, nie obsługiwane na git 1.7.1.

Mała wioska
źródło
2
Dla wszystkich innych, którzy próbują uzyskać kolor podczas podłączania do lesstakiego, jakim właśnie byłem, możesz lessprzekazać znaki zmiany koloru do terminala przez less -R.
xdhmoore
Kiedy dodano tę funkcję?
Ondra Žižka
11
git config --global color.ui always
git config --global color.branch always
git config --global color.diff always
git config --global color.interactive always
git config --global color.status always
git config --global color.grep always
git config --global color.pager true
git config --global color.decorate always
git config --global color.showbranch always
mlibre
źródło
1

Możesz to zrobić za pomocą Colourer Arbitrary Command Output . W większości działa, ale nie wymyśliłem, jak obejść błąd, w którym monity oczekujące danych wejściowych nie są wyświetlane i nie można po prostu wpisać znanego wymaganego wejścia i nacisnąć klawisz Enter, aby kontynuować w każdym przypadku.

Przykład ~/.acoc.confdla git:

# git
[git/ae]
/.*(error:.*)/                                    red+bold
/.*(warning:.*)/                                  yellow
/.*(hint:.*)/                                     magenta
/.*(up-to-date).*/                                green+bold
/.*(nothing to commit).*/                         green
/^(\+.*)/                                         green
/^(-.*)/                                          red

..which działa ładnie wraz z alias git="acoc git"in .bash_profile.

Tom Mahoney
źródło
Czy możesz udostępnić swoją konfigurację acoc?
Greg Dubicki
Nvm, łatwo było pisać. :) Dodano do odpowiedzi.
Greg Dubicki
1

W przypadku kolorowego git diffpotoku lessdziała to:

git -c color.diff=always diff [...] | less -R
jox
źródło
0

Wiem, że post ma cztery lata, ale nikt nie odpowiedział z mojego obozu, ślepy na kolory. Jeśli potrafisz rozróżnić kolory, zignoruj ​​mój post.

Na przykład „status git” powoduje wyświetlenie tekstu, który jest biały na tle / czarny na białym tle (czytelny), ciemnoszary dla usuniętego (nieczytelny na czarnym tle, ale czytelny na białym tle) i średni szary dla dodanego (jęczmień czytelny na czarnym tle tło, nieczytelne na białym tle). Kiedyś przełączałem tło okna terminala na / z białego / czarnego, aby móc odczytać nieczytelny tekst. Proste rozwiązanie to więcej:

 git status | more

Dzięki temu cały tekst jest czytelny na standardowym białym lub czarnym tle okna terminala.

Jan David Narkiewicz
źródło
1
Możesz także zmienić konfigurację, aby domyślnie ustawić wszystko na brak koloru ( color.ui = never).
Facet z kapeluszem,
0

lub wyłącz wszystkie / większość kolorowania poprzez:

git config --global color.ui false
git config --global color.branch false
git config --global color.diff false
git config --global color.interactive false
git config --global color.status false
git config --global color.grep false
git config --global color.pager false
git config --global color.decorate false
git config --global color.showbranch false
theRiley
źródło
PO nie chce włączyć się kolory, raczej zwrócić na kolory. W PO stwierdził, jak to zrobić giti chce, aby to zrobić w bardziej globalnym sensie. Jeśli znasz taką metodę, edytuj swoją odpowiedź, aby to wyjaśnić.
Gypsy Spellweaver
czasami ludzie szukają czegoś blisko spokrewnionego, ale nieco innego - ale dziękuję za opinię.
theRiley
Podobało mi się @Riley
Richard Lindhout