
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:

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):

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?

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 auto
was 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.

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).
10126400cookie-checkDie Ausgabe von Git Log geht verloren, wenn sie in eine Datei geleitet wird – was übersehe ich?yes
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 aufauto
– Markus Adelsberger
21. November 2017 um 14:37 Uhr