Erzwinge "Git Status", um Farbe auf dem Terminal auszugeben (innerhalb eines Skripts)

71

BEARBEITEN:

Ich möchte empfehlen, dass das Parsen von Farben eine allgemein schlecht durchdachte Idee ist.

Ein Grund, warum ich es wollte, war, dass ich es sowohl analysieren als auch in meiner eigenen Skriptausgabe weitergeben kann. Das ist ... okay, aber es wäre wahrscheinlich vernünftiger, Porzellan oder ähnliches zu verwenden und die farbigen Teile selbst wieder aufzubauen!

Die ursprüngliche Frage folgt.


Ich mag es, Farben zu sehen, weil meine Skripte (bisher) robust genug sind, um die Farbcodes zu verarbeiten. Es scheint, als würde ich hier gegen den Strich gehen, aber ich verstehe ehrlich gesagt nicht, was die große Sache ist, Dinge wie Escape-Codes in Skripten analysieren zu müssen. Wenn Farben für die interaktive Verwendung hilfreich sind, warum helfen sie dann nicht bei der Verwendung von Skripten, bei denen ich möglicherweise Daten aggregiere und noch mehr Daten zusammenfasse als manuell? Wären Farben nicht noch wichtiger ?

Wie auch immer, ich habe ein hübsches kleines Shell-Skript, das ich geschrieben habe und das Munges git statusausgibt, und ich möchte nur, dass dieses Skript die Farben intakt hält. Meine globale Git-Konfiguration ist so eingestellt, dass die Listen der geänderten und nicht verfolgten Dateien im Git-Status in Farbe angezeigt werden. Leider git diffgibt es im Gegensatz dazu keine Möglichkeit, Farbe für zu erzwingengit status , die ich finden kann.

Um ganz klar zu sein, ist dies das Problem:

$ git status

erzeugt eine perfekte Ausgabe, aber (Auszug aus meinem Skript folgt)

git status | sed "s/^#/\x1b[34m#[0m/"

erzeugt keine farbige git statusAusgabe, und Sie können hier sogar sehen, dass ich die führenden Hash-Zeichen explizit in Blau konvertiere, da dies dazu beiträgt, die verschiedenen Ausgabebereiche meines Skripts hervorzuheben.

Weiß jemand, wie man es dazu bringt, die Farben zu löschen? Gibt es vielleicht ein Standardprogramm, das ich verwenden kann und das als STDIN / STDOUT-Pipe "Fake Terminal" verwendet werden kann? Tatsächlich arbeite ich auch an einem pty-Pseudoterminal-Tool, damit ich es sicherlich für diesen Zweck nutzen kann, aber es ist eine ziemlich hartnäckige Lösung (und noch nicht einsatzbereit, da ich sie noch nicht fertig gebaut habe).

Steven Lu
quelle
Überprüfen Sie auch, wie Ausgabe von Git
Sithsu
5
Ein Problem beim Parsen von Farbcodes zum Extrahieren aussagekräftiger Daten für Skripte besteht darin, dass ein anderer Benutzer möglicherweise unterschiedliche Farben in seiner Konfigurationsdatei konfiguriert hat. Um die Probleme zu vermeiden, die dazu führen würden, bietet git die --porcelainOption für verschiedene Befehle, die ein Format bieten sollten, das einfacher zu analysieren und weniger anfällig für Änderungen zwischen Umgebungen ist.
Joeytwiddle
1
Um den Kommentar von @ joeytwiddle als Designnotiz hinzuzufügen, ist es eine schlechte Idee, Statusinformationen nur als Farbe zu codieren, da einige Menschen verschiedene Arten von Farbenblindheit haben (Rot-Grün ist die häufigste, aber es gibt auch Blau-Gelb und mehr ; Details siehe nei.nih.gov/health/color_blindness/facts_about ). Es betrifft ungefähr 10% der Menschen! Stellen Sie immer sicher, dass es eine andere Möglichkeit als nur Farbe gibt, um die erforderlichen Informationen zu extrahieren.
Torek

Antworten:

114

Um eine Änderung Ihrer Git-Konfiguration zu vermeiden, können Sie Farbe nur für den aktuellen Befehl aktivieren, indem Sie eine Konfigurationsvariable mit übergeben -c.

Für den statusBefehl lautet die Variable color.status:

    git -c color.status=always status | less -REX

Für diff, show, logund grepBefehle ist die Variable color.ui:

    git -c color.ui=always diff | less -REX

Beachten Sie, dass -ckommen , müssen vor dem statusoder diffArgument und nicht nach.

Alternativ kann für diff, show, logund grepBefehle, können Sie --color=always nach dem Befehl:

    git diff --color=always | less -REX

Hinweis: Wie Steven sagte, können Sie, wenn Sie versuchen, aussagekräftige Daten zu extrahieren, anstatt Farben zu analysieren, um die Bedeutung zu extrahieren, --porcelaineine parserfreundlichere Ausgabe erhalten.

    git status --porcelain | awk ...

Wenn Sie möchten, können Sie die Farben später wieder einführen.

Um die vom Benutzer konfigurierten Farben zu erhalten, können Sie verwenden git config --get-colour :

    reset_color="$(tput sgr0)"
    remote_branch_color="$(git config --get-color color.branch.remote white)"

    echo "Pushing to ${remote_branch_color}${branch_name}${reset_color}"

Einige weitere Beispiele hier .

joeytwiddle
quelle
1
Sie sagen, es funktioniert für das Protokoll , aber ich finde nicht, dass dies der Fall ist. :(
Adrian
3
Hmmm, sieht so aus, als wäre das für Log anders . Der Befehl lautet git log --color=always. Schade um die Inkonsistenzen mit der Kommandozeilenschnittstelle.
Adrian
2
Es sieht so aus, als hätte git versucht, dies mit diff , show und log zu vereinheitlichen , indem er den --color=...Schalter nach dem Befehl wie angegeben verwendet hat, dies jedoch nicht mit dem Status aktualisiert hat .
Adrian
1
Ich habe die Frage gestellt. In den Teilen meines Codes, die analysiert werden git status, analysieren sie die Ausgabe von git status --porcelain. Trotzdem ist es sehr cool zu wissen, dass wir config for git für den aktuellen Aufruf mit überschreiben können -c.
Steven Lu
Weitere nützliche Informationen zum Kolorieren
Kolorieren von
20

BEARBEITEN:

Ich möchte nachdrücklich empfehlen, dass das Parsen von Farben eine allgemein schlecht durchdachte Idee ist.

Ein Grund, warum ich es wollte, war, dass ich es sowohl analysieren als auch in meiner eigenen Skriptausgabe weitergeben kann. Das ist ... okay, aber es wäre wahrscheinlich vernünftiger, Porzellan oder ähnliches zu verwenden und die farbigen Teile selbst wieder aufzubauen!

Die ursprüngliche Antwort folgt.


Ich finde immer sehr schnell Antworten, nachdem ich Fragen gestellt habe. Dies hat damit zu tun, dass Sie lange genug über ein Problem nachdenken, um es aufzuschreiben und bessere Lösungsansätze zu formulieren. Wie auch immer, die Lösung dafür ist gerecht

git config color.status always

Ich stelle mir vor, dass eine Allzwecklösung beinhaltet expectoder etwas ptydamit zu tun hat, Programme, die dies erfordern, dazu zu zwingen, zu glauben, dass sie sich auf einem Terminal befinden.

Steven Lu
quelle
7
@joeytwiddle hat eine bessere Antwort ... Wenn Sie immer Farbe erzwingen, können Sie Farbe an einigen Stellen erhalten, an denen Sie sie nicht möchten. Die Verwendung von -c beschränkt den Bereich auf das betreffende Skript.
Danwyand
4
git config --global color.ui auto
Ashish Sajwan
1
Ich habe meine Annahme geändert, sie beantwortet meine Frage direkter. @AshishSajwan Wenn Sie die Farbe auf Auto setzen, werden beim Ausführen mit einem Skript KEINE Farben erzeugt.
Steven Lu
Ja, Ausgänge sind normalerweise entweder als MENSCHLICH LESBAR oder MASCHINENLESBAR gedacht und haben ganz unterschiedliche Eigenschaften.
Raúl Salinas-Monteagudo
1
Wenn Sie Porzellandaten analysieren und dann Ihre eigenen Farbcodes zur Ausgabe hinzufügen, können Sie überprüfen, ob der Benutzer für bestimmte Dinge wie diese eine bevorzugte Farbe konfiguriert hat: current_branch_termcode="$(git config --get-color color.branch.current green)"Wo greenist der Fallback, den Sie verwenden möchten, wenn es keinen gibt? Benutzerdefinierte Konfiguration gefunden (idealerweise die Standardfarbe von git dort einfügen).
Joeytwiddle
2

Ich hatte das gleiche Problem bei der Verwendung eines Git-Alias, der einen Shell-Befehl ausführt. Anscheinend erbt die Git-Shell nicht von der aktuellen Umgebung, daher weiß sie nichts über meine Farbeinstellungen.

Zusätzlich zum Hinzufügen der globalen Git-Farb-UI-Einstellung habe ich dies behoben, indem ich meinen Alias ​​wie folgt aussehen ließ. Dies ist der sekundäre Befehl, bei dem die Verwendung von Farben angewiesen werden muss, da Git standardmäßig ab der von den Leuten erwähnten Version 1.8.x verwendet wird.

[alias]
  ignored = !git ls-files -v|grep --color '^h'

Dies erzeugt jetzt eine äquivalente kolorierte Ausgabe, wenn es als Alias ​​ausgeführt wird, so als ob ich gerade den Befehl ausgeführt hätte.

Für sed scheint diese andere Antwort zuverlässiger zu funktionieren. Verwenden Sie tput. https://unix.stackexchange.com/a/45954

dragon788
quelle
Während dieser Link die Frage beantworten kann, ist es besser, die wesentlichen Teile der Antwort hier aufzunehmen und den Link als Referenz bereitzustellen. Nur-Link-Antworten können ungültig werden, wenn sich die verknüpfte Seite ändert.
ZygD