Die Ausgabe von Git Log geht verloren, wenn sie in eine Datei geleitet wird – was übersehe ich?

Lesezeit: 4 Minuten

Benutzer-Avatar
Charlie Salz

Ich versuche, einige Informationen über einige Git-Commits über die Befehlszeile als Teil eines größeren automatisierten Tools zu erhalten, das ich baue. Die gewünschten Informationen sind über diesen Git-Log-Befehl verfügbar:

git log --branches --graph --oneline --parents

was diese Ausgabe erzeugt:

Geben Sie hier die Bildbeschreibung ein

Das ist großartig, weil es die Hashes und Tags hat, die ich will, sowie die Commit-Nachrichten. Wenn ich dies jedoch an eine Datei weiterleite, scheint das Zeug in den Klammern irgendwie verloren zu gehen. Ich interessiere mich nicht allzu sehr für die Farbe, aber ich möchte nur den reinen Text, wie ich es von jedem * nix-ähnlichen Programm erwarten würde.

Dies ist die Ausgabe, die ich stattdessen zu erhalten scheine, wobei einige der gewünschten Ausgaben weggelassen werden (z. B. die Tag-Informationen):

Geben Sie hier die Bildbeschreibung ein

Ich bin mir nicht sicher, wie oder warum diese Informationen verloren gehen, wenn sie irgendwo weitergeleitet werden. Ich habe das Gefühl, dass dies etwas unglaublich Einfaches und Offensichtliches sein könnte.

Ich habe das gleiche Problem, egal ob ich dies in Bash unter Arch Linux (mit der neuesten Version von Git) oder in der MINGW64 Bash-Umgebung in Windows mache.

Frage: Wie kann ich die Ausgabe von git log vollständig erfassen, ohne die Informationen zu verlieren, die beim Weiterleiten an eine Datei verloren gehen?

  • leite auch stderr um: 2>&1

    – Gerhard Schneider

    21. November 2017 um 13:43 Uhr

  • Warum wird dem oben Kommentierten zugestimmt, wenn es faktisch keine Lösung des Problems ist, wie selbst der minimalste Test zeigt und durch die Dokumentation bestätigt wird?

    – Markus Adelsberger

    21. November 2017 um 14:08 Uhr

  • git kann sich anders verhalten, wenn es erkennt, dass seine Standardausgabe kein Terminal ist. Es passiert jedoch (auch) etwas anderes, da Sie diese Ausgabe nicht ohne erhalten sollten --decorate Option in Ihrem Befehl.

    – chepner

    21. November 2017 um 14:35 Uhr

  • @chepner – das “etwas andere” ist so einfach wie das zu haben log.decorate Konfigurationswert gesetzt auf auto

    – Markus Adelsberger

    21. November 2017 um 14:37 Uhr

Benutzer-Avatar
Markus Adelsberger

Sie müssen die hinzufügen --decorate Option zu Ihrem Protokollbefehl. Stellen Sie es entweder als ein --decorate=short oder --decorate=full.

Es erscheint in Ihrer Konfiguration, die Sie wahrscheinlich haben log.decorate einstellen autowas bedeutet, dass Tags und dergleichen angezeigt werden (in short Form) beim Schreiben in das Terminal, aber nicht in eine Pipe oder eine andere Datei.

Ebenso gibt es Konfigurationswerte und Befehlsoptionen, die bestimmen, ob (und wann) Farbcodes ausgegeben werden; so

git log --branches --graph --oneline --parents --decorate=short --color=always

würde die Tags und Farben auch dann ausgeben, wenn in eine Datei umgeleitet wird.

Beachten Sie, dass Sie beim Skripten diese Optionen wahrscheinlich in die Befehlszeile einfügen sollten, anstatt Annahmen darüber zu treffen, welche Konfigurationswerte festgelegt sind. Je nachdem, was Sie mit der Ausgabe machen, log kann sowieso der beste Befehl für die Verwendung beim Skripting sein oder auch nicht, da Git-Befehle etwas unterteilt sind in solche, die für den menschlichen Gebrauch bestimmt sind, und solche, die für das Skripting gedacht sind.

Benutzer-Avatar
ghoti

Dein Git-Befehl:

git log --branches --graph --oneline --parents

erzeugt für mich nicht die gleiche Ausgabe, die Sie in Ihrem ersten Beispiel zeigen. Es erzeugt jedoch eine ähnliche Ausgabe wie im zweiten Beispiel. Die Ref-Namen in den Klammern (Zweige und Tags) werden eingeschlossen, wenn Sie die hinzufügen --decorate Möglichkeit. (Hier ist die Dokumentation.)

Beachten Sie, dass Ihr Git-Protokollformat in Ihrem gesteuert werden kann ~/.gitconfig Datei. Das Format, das Sie in Ihrer Frage gezeigt haben, sieht beispielsweise so aus, als könnte es mit folgenden Optionen erreicht werden:

git log --decorate --graph --all --format="%C(auto,yellow)%h%C(auto,reset) %C(auto,yellow)%p%C(auto,reset) %C(auto,red)%d%C(auto,reset) %s %C(auto,green)%an%C(auto,reset) (%C(auto,cyan)%ar%C(auto,reset))"

Wenn Sie versuchen, Dinge zu automatisieren, können Sie ein Format angeben, das besser auf Ihre Anforderungen abgestimmt ist. Überprüf den Git-Dokumentation für hübsche Formate für Details. Achten Sie insbesondere auf die %C Format und die %C(auto,…​) Notation, wodurch Farbsteuerelemente nur verwendet werden, wenn der Befehl von einem Terminal ausgeführt wird.

Wenn Sie die Farbinformationen immer generieren möchten, unabhängig davon, ob Sie verwenden git log interaktiv können Sie jedes Vorkommen von entfernen auto, in der obigen Zeile (oder Alias).

1012640cookie-checkDie Ausgabe von Git Log geht verloren, wenn sie in eine Datei geleitet wird – was übersehe ich?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy