2017-11-21 3 views
0

Ich versuche, einige Informationen über einige Git-Commits über die Befehlszeile als Teil eines größeren automatisierten Tools, das ich erstelle, zu erhalten. Die Informationen, die ich ist über diesen git log Befehl verfügbar sein soll:Ausgabe von git log geht verloren, wenn piped zu Datei - was fehlt mir?

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

die diese Ausgabe erzeugt:

enter image description here

Das ist großartig, denn dies hat die Hashes und Tags, die ich will, als auch als die Commit-Nachrichten. Wenn ich das jedoch in eine Datei pipe, scheint das Zeug in den Klammern irgendwie verloren gehen. Ich interessiere mich nicht sehr für die Farbe, aber ich will nur den einfachen Text, wie ich es von jedem * nix-ähnlichen Programm erwarten würde.

Dies ist die Ausgabe scheine ich stattdessen zu bekommen, das einen Teil der Ausgabe auslässt Ich möchte (zB die Tag-Informationen):

enter image description here

Ich bin nicht sicher, wie oder warum diese Informationen bekommen verloren, wenn irgendwo gepipst wird. Ich denke, das könnte etwas unglaublich Einfaches und Offensichtliches sein.

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

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

+1

Umleitung Stderr auch: '2> & 1' –

+1

Warum ist die oben genannten upvoted, wenn es tatsächlich keine Lösung für das Problem ist, wie selbst die minimalste Test gezeigt und durch die Dokumentation bestätigt? –

+0

'git' kann sich anders verhalten, wenn es feststellt, dass seine Standardausgabe kein Terminal ist. Es läuft aber auch etwas anderes, weil Sie diese Ausgabe nicht ohne die Option "--decorate" in Ihrem Befehl erhalten sollten. – chepner

Antwort

3

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

Es scheint in der Config Sie wahrscheinlich log.decorate Set auto haben, was bedeutet, dass Tags und so angezeigt (in short Form), wenn an das Terminal zu schreiben, aber nicht an einem Rohr oder einer anderen Datei.

In ähnlicher Weise gibt es Konfigurationswerte und Befehlsoptionen, die bestimmen, ob (und wann) Farbcodes ausgegeben werden; also

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

würde die Tags und Farben auch bei Umleitung in eine Datei ausgeben.

Beachten Sie, dass Sie bei der Skripterstellung diese Optionen wahrscheinlich in die Befehlszeile aufnehmen sollten, anstatt Annahmen darüber zu treffen, welche Konfigurationswerte festgelegt sind. Abhängig davon, was Sie mit der Ausgabe machen, ist log möglicherweise der beste Befehl, der sowieso für die Skripterstellung verwendet werden soll, da git-Befehle etwas in solche unterteilt sind, die für den menschlichen Konsum gedacht sind, im Gegensatz zu denen, die für das Scripting gelten.

-1

Ihr git Befehl:

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

nicht die gleiche Leistung für mich produzieren, dass Sie in Ihrem ersten Beispiel zeigen. Es erzeugt jedoch eine Ausgabe ähnlich dem zweiten Beispiel. Die Ref-Namen in den Klammern (Verzweigungen und Tags) sind enthalten, wenn Sie die Option --decorate hinzufügen. (Here's the documentation.)

Beachten Sie, dass Ihr Git Log-Format in Ihrer ~/.gitconfig Datei gesteuert werden kann. Zum Beispiel sieht das Format, das Sie in Ihrer Frage gezeigt haben, wie es mit Optionen wie dies erreicht werden könnte:

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, die Dinge zu automatisieren, können Sie ein Format angeben, die besser auf Ihre Anforderungen abgestimmt ist . Überprüfen Sie die git documentation for pretty-formats für Details. Achten Sie insbesondere auf das Format %C und die Schreibweise %C(auto,…​), wodurch Farbsteuerelemente nur dann verwendet werden, wenn der Befehl von einem Terminal ausgeführt wird.

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