Wie kann ich dafür sorgen, dass das Git-Protokoll nicht zur Fortsetzung auffordert?

89

Ich habe ein paar Git-Repositorys, die zusammengehören, und eine einfache Batch- / Bash-Datei, um sie zu durchlaufen. Ich überlaufe sie oft mit einem Protokollbefehl, um schnell zu sehen, in welchem ​​Zustand sie sich befinden. Dies funktioniert gut, abgesehen von einer Sache: Wenn die Festschreibungsnachricht länger als die Anzahl der Zeichen ist, die meine Konsole breit ist (oder mehrere Zeilen hat), git zeigt die Zeile, dann eine neue Zeile mit (END) und ich muss q drücken, um fortzufahren (ich denke, es leitet die Ausgabe durch mehr oder so etwas). Beispiel:

> gitloop . "git log --decorate=short --pretty=oneline -n1"
18629ae238e9d5832cb3535ec88274173337a501 (HEAD, origin/master, master) short log

625fb891b9b0b8648459b07ace662ae3b7773c7f (HEAD, origin/master, origin/HEAD, master) short log

dc0838118266ba8570ea338c1faddfe8af0387bb (HEAD, origin/work, origin/master, work, master) oops loooooooooooooong log
-(END)

Dies ist ziemlich unpraktisch, da ich ein paar Mal q drücken muss , während ich nur all diese Oneliner auf einmal sehen möchte.

Wie kann ich dieses Verhalten deaktivieren (vorzugsweise unter Beibehaltung dieses Protokollformats)?

stijn
quelle
1
Mögliches Duplikat, warum ich am Ende des Git-Protokolls q
drücken muss

Antworten:

145

Git hat eine Option zum Deaktivieren des Pagers:

git --no-pager log --decorate=short --pretty=oneline -n1

Wenn Ihr Pager Linien schneidet und Sie dieses Verhalten beibehalten möchten, leiten Sie entweder an cut...

git --no-pager log --decorate=short --pretty=oneline -n1 | cut -c 1-$COLUMNS

... oder setzen Sie die Umgebungsvariable GIT_PAGERvor dem Aufruf:

GIT_PAGER="cut -c 1-${COLUMNS-80}" git --no-pager log --decorate=short --pretty=oneline -n1
toabi
quelle
Gibt es eine Möglichkeit, --no-pagerdie Standardeinstellung oder sogar eine Verknüpfung für diese Option bei Bedarf zu verbessern? Ich dachte an Aliasing gitnpzu git --no-pager, aber ich denke , es gibt eine bessere Lösung ist.
Islam Azab
1
@IslamAzab, Sie könnten einen Alias ​​verwenden git, /usr/bin/git --no-pagerder den Pager für alle Ihre Git-Aufrufe deaktiviert.
Mrkmg
1
@WarrenP githat keinen eingebauten Pager. Stattdessen folgt es der Unix-Philosophie und verwendet alles, was Sie haben $PAGER. gitverwendet einfach immer, $PAGERanstatt dies nur zufällig zu tun, im Gegensatz zu vielen anderen schlecht geschriebenen Werkzeugen. Die einzige Magie githat , ist , dass , wenn $LESSsie nicht definiert , es definieren wird $LESSauf dem Wert FRX. Siehe um github.com/git/git/blob/master/Documentation/config.txt#L766 für weitere Details.
Mikko Rantalainen
@WarrenP gitbietet einfach eine Überschreibung GIT_PAGER , mit der Sie benutzerdefinierte Werte definieren können, die verwendet werden sollen, anstatt PAGERwann immer Git Paging benötigt.
Mikko Rantalainen
1
Einfachster Fall, der das Verhalten nur für Git behebt: Export GIT_PAGER = cat
Stragulus
16

Eine weitere Lösung für das Problem der dauerhaften Deaktivierung des Pagers speziell bei Verwendung des logUnterbefehls:

  • Nur für aktuelles Repo:
    git config pager.log false

  • für Ihre Git-Installation (dh alle Repos auf Ihrem Computer):
    git config --global pager.log false

Wie Sie sich vorstellen können, funktioniert dasselbe, wenn Pager benötigt wird auf oder ab selektiv für einige andere Unterbefehle.
Z.B. für branchden Unterbefehl (der Zweige druckt) wird es sein

git config pager.branch false


Die vorgeschlagene Lösung ist im Vergleich zu wohl eleganter

  • Verwenden Sie git --no-pagerjedes Mal, wenn Sie einen bestimmten Befehl ausführen.
    Weil es durchaus möglich ist, dass Sie es nicht jedes Mal eingeben möchten.

  • Angabe git --no-pagerals Alias ​​fürgit
    Weil Sie möglicherweise implizite globale Konfigurationen vermeiden möchten oder in einigen Fällen den Pager aktivieren möchten .

  • stützen sich auf einige Umgebungsvariablen wie PAGERoder GIT_PAGER.
    Dazu müssen Sie sicherstellen, dass sie in Ihrer aktuellen Terminalsitzung festgelegt sind. Wenn Sie möchten, dass sie bei jeder Erstellung Ihres neuen Terminals automatisch auf einen benutzerdefinierten Wert gesetzt werden, müssen Sie eine der Shell-Bootstrap-Dateien ändern, z ~/.bashrc. Das ist kein großes Problem. Aber diese Bootstrap-Dateien werden häufig auch von anderen Anwendungen geändert und enthalten eine Reihe anderer Dinge, nicht nur die von Git verwendeten. Theoretisch ist es also besser, git-bezogene Einstellungen mit zu spezifizieren, git configals sie z ~/.bashrc.


Die alternative Lösung zum Deaktivieren pager für alle Unterbefehle besteht darin, anzugeben, catwie das Dienstprogramm git das Paging verwendet:

  • git config core.pager cat ODER
  • git config --global core.pager cat

Meine Antwort ist eine Umformulierung der folgenden:
"Verhindern Sie, dass Git Diff einen Pager verwendet?"
https://stackoverflow.com/a/6986231/6103242

Es wird darauf verwiesen, um auf eine andere relevante Diskussion hinzuweisen.

vladZamskoi
quelle
3

Pager für alle Befehle deaktivieren:

git config --global core.pager '' 
Marchozaur
quelle
2

Sie leiten es an weniger -F weiter, falls --no-pager für Sie nicht funktioniert.

git log --decorate --oneline -5 | less -F
Nick Constantine
quelle