Der Git-Verzweigungsbefehl verhält sich wie 'weniger'.

414

Wenn ich den git branchBefehl verwende, um alle Zweige aufzulisten, sehe ich die Ausgabe von git branch | less.

Der Befehl git branchsoll eine Liste von Zweigen anzeigen, wie lsdies auch für Dateien der Fall ist.

Dies ist die Ausgabe, die ich bekomme:

Geben Sie hier die Bildbeschreibung ein

Wie erhalte ich das Standardverhalten von git branch? Was verursacht die ausgelagerte Ausgabe?

Ich benutze ZSH mit oh_my_zsh(nichts für Git drin ) und mein .gitconfigAussehen sieht so aus:

[user]
  email = [email protected]
  name = Dennis Haegler
[push]
  default = simple
[merge]
   tool = vimdiff
[core]
  editor = nvim
  excludesfile = /Users/dennish/.gitignore_global
[color]
  ui = true
[alias]
  br = branch
  ci = commit -v
  cam = commit -am
  co = checkout
  df = diff
  st = status
  sa = stash
  mt = mergetool
  cp = cherry-pick
  pl = pull --rebase
[difftool "sourcetree"]
  cmd = opendiff \"$LOCAL\" \"$REMOTE\"
[mergetool "sourcetree"]
  cmd = /Applications/SourceTree.app/Contents/Resources/opendiff-w.sh 
  \"$LOCAL\" \"$REMOTE\" -ancestor \"$BASE\" -merge \"$MERGED\"
  trustExitCode = true
DenniJensen
quelle

Antworten:

736

Wie in den Kommentaren zu Mark Adelsbergers Antwort erwähnt , war dies eine Standard-Verhaltensänderung, die in Git 2.16 eingeführt wurde .

git branchMit der pager.branchKonfigurationseinstellung können Sie die Seitenausgabe standardmäßig für das Zurücksetzen deaktivieren :

git config --global pager.branch false
Zach Schneider
quelle
127
Das ist eine seltsame, seltsame Entscheidung, einen Standard zu machen. Ich erwarte, dass sich meine Unix-y-CLI-Tools wie dumme einfache Programme verhalten, die Sie verketten können, wenn Sie möchten, aber ich denke, dass die Diskussion für eine andere Site ist.
Stragulus
7
@Stragulus Beachten Sie, dass die neue Standardeinstellung Sie nicht daran hindert, git branchmit etwas anderem zu verketten . Mit der Pipe-Erkennung gibt Git die Verzweigungsliste innerhalb der Befehle git branch > branches.txtoder an stdout aus git branch | wc -l.
Rory O'Kane
3
@ RoryO'Kane aber mit Pager habe ich ESC/qnach einer einfachen git branchÜberprüfung einen Typ extra .
Mitnk
23
@mitnk Nicht unbedingt. Wenn dies der Fall ist less, können Sie --no-init --quit-if-one-screenIhrer LESSUmgebungsvariablen hinzufügen , was dazu führt, dass lessnur in stdout geschrieben wird, wenn der Text ohne Bildlauf angezeigt werden kann. Siehe man lessfür weitere Details.
Rory O'Kane
13
Wenn Sie es manuell in Ihre Konfigurationsdatei einfügen möchten, ist es [pager] branch = false(in zwei Zeilen).
Sam
56

Wie andere Antworten hervorhoben, leitet sich Git lessfür die meisten Befehle standardmäßig ( standardmäßig) in einen Pager .

Ein wichtiger Punkt ist jedoch, dass Git , wenn die Umgebungsvariable WENIGER nicht gesetzt ist , sie auf FRX setzt. Dies hat zur Folge, dass das vom Benutzer sichtbare Verhalten dasselbe ist, als ob der Pager nicht verwendet worden wäre, wenn die Ausgabe des Befehls kurz wäre (d. H. wenn Sie nur wenige Zweige haben). Siehe Mann weniger :

-F oder --quit-if-one-screen Bewirkt, dass
weniger automatisch beendet wird, wenn die gesamte Datei auf dem ersten Bildschirm angezeigt werden kann.

-R oder --RAW-CONTROL-CHARS
[...] ANSI-Escape-Sequenzen "Farbe" werden in "Roh" -Form ausgegeben.

-X oder --no-init
Deaktiviert das Senden der Zeichenfolgen für die Termcap-Initialisierung und -Deinitialisierung an das Terminal. Dies ist manchmal wünschenswert, wenn die Deinitialisierungszeichenfolge etwas Unnötiges bewirkt, z. B. das Löschen des Bildschirms.

Wenn Sie das von Ihnen beschriebene Verhalten erhalten, haben Sie höchstwahrscheinlich $LESSetwas anderes festgelegt, und wenn Sie es ( unset LESS) deaktivieren, wird das Problem behoben, während das "Pager" -Verhalten für eine lange Ausgabe beibehalten wird. Alternativ können Sie das Verhalten aktivieren, während Sie es unverändert $LESSlassen, indem Sie es Ihrer .gitconfigDatei hinzufügen :

[core]
    pager = less -FRX

Wenn Sie das Pager-Ding wirklich nicht mögen, können Sie es global oder auf Befehlsbasis deaktivieren (siehe andere Antworten).

Matthieu Moy
quelle
40

Nicht um über Semantik zu streiten, aber das Verhalten, das Sie erhalten, ist die Standardeinstellung. Deshalb bekommen Sie es, wenn Sie nicht nach etwas anderem fragen. Standardmäßig branch(und zahlreiche andere Git-Befehle) wird beim Senden der Ausgabe an das Terminal ein Pager verwendet.

Sie können diese Standardeinstellung mit der folgenden --no-pagerOption überschreiben :

git --no-pager branch

Wenn Sie die Ausgabe in eine Datei umleiten, sollte Git erkennen, dass sie nicht in ein Terminal schreibt, und daher ohnehin keinen Pager verwenden. (Auf der anderen Seite schlägt dies einen Anwendungsfall für die Skripterstellung vor. In diesem Fall sollten Sie die Verwendung eines Installationsbefehls git for-each-refin Betracht ziehen, wie dies vorzuziehen ist git branch.)

Mark Adelsberger
quelle
git --no-pager branchfunktioniert. Aber wie ist das eingestellt? Nur die PAGERUmgebungsvariable ist auf gesetzt less. Dies ist nicht das Standardverhalten. Alle meine Colleges haben eine Ausgabe als Liste, die auf dem Terminal ausgedruckt wird.
DenniJensen
Welche Version von Git verwendest du? Und welches verwenden Ihre Kollegen?
Lasse V. Karlsen
2.16.0! Ist dies eine Funktion, die in dieser Version für Git eingeführt wurde?
DenniJensen
Ja, es ist jetzt Standard. github.com/git/git/blob/master/Documentation/RelNotes/… Mein College neben mir verwendet dieselbe Version und hat dieses Problem nicht :) thx @mark
DenniJensen
1
Dies ist die überlegenste Antwort hier, traurig, dass es so wenige positive Stimmen gibt, weil ich ziemlich viel gescrollt habe, um dieses Meisterwerk zu finden.
Codepleb
25

Dieses Git-Verhalten war auch für mich immer nerviger. Ich habe meine Tag-Liste lesshinzugefügt, wenn ich zum Beispiel nur Tags auflisten möchte.

Sie können dieses Verhalten auch steuern, indem Sie den Standard- Git-PAGER in catanstelle von ändern less. Ich scrolle lieber in iTerm als in einem Editor. Ich benutze den Editor gerne, wenn ich will.

Damit:

git config --global core.pager cat
ionescu77
quelle
1
Ja, das sollte eine gültige Antwort für mich sein
Tura
2
Danke für die Warnung. Ich gebe zu, dass ich nach ein paar Monaten immer noch Katze benutze, aber zum Beispiel git logist es ärgerlich, wenn ich es tue . Ich vermisse nur das ursprüngliche Verhalten, hatte aber keine Zeit, meinen täglichen Workflow in dieser Perspektive zu verbessern.
Ionescu77
Sie gewinnen! ... Perfekt!
SDLINS
2
Beachten Sie, dass dies auch für git log...
Bagerard
10

Für diejenigen, die ihre aktualisieren möchten, ~/.gitconfigum dies zu beheben, würde es so aussehen:

[pager]
   branch = false
Nick
quelle
Seltsame Sache hier: Diese Einstellung hat funktioniert und seit einigen Tagen ist es nicht mehr, hat sich etwas geändert oder wird meine Konfiguration einfach nicht angewendet?
ConquerorsHaki
7

Der Git-Verzweigungsbefehl verhält sich wie 'weniger'.

Weil Git standardmäßig die Ausgabe im Pager öffnet (zumindest in Ubuntu). Die akzeptierte Antwort ersetzt den Pager vollständig, was Ihnen möglicherweise nicht gefällt, wenn Ihre Ausgabe sehr lang ist.

Ich würde empfehlen, den Pager durch einen zu ersetzen less, damit er nicht weniger als die Höhe des Terminals "scrollt".

git config --global --replace-all core.pager "less -F -X"
Imran Ahmad
quelle
3

Mach Folgendes:

[alias]
  br = !git --no-pager branch
João Tiago
quelle
2

Die akzeptierte Antwort scheint falsch zu sein. Es gibt zwei Probleme:

  1. Das Verhalten unterscheidet sich tatsächlich zwischen (standardmäßig konfiguriert) bash und zsh. Das 'Problem' taucht nur unter zsh auf.
  2. Bei der vorgeschlagenen Lösung wird git branchnicht immer ein Pager verwendet, was bei hoher Ausgabe nicht erwünscht ist.

Der wahre Grund ist, dass bash und zsh unterschiedliche Standarddefinitionen für LESS haben: bash definiert nichts, während zsh es definiert -R. Wenn ich unset LESSin zsh mache , geht alles wieder normal ....

Das -RVerhalten kann noch erwünscht sein. In diesem Fall können Sie Ihrer .zshrc-Datei die folgende Anweisung hinzufügen, damit alles funktioniert:

export LESS=-FRX

-F'bewirkt, dass weniger automatisch beendet wird, wenn die gesamte Datei auf dem ersten Bildschirm angezeigt werden kann'. Allerdings -Xmuss gleichzeitig angegeben werden, sonst wird keine Ausgabe angezeigt, wenn es weniger als eine Bildschirmseite der Ausgabe.

Yongwei Wu
quelle
0

https://git-scm.com/book/en/v2/Git-Internals-Environment-Variables

GIT_PAGER steuert das Programm, mit dem die mehrseitige Ausgabe in der Befehlszeile angezeigt wird. Wenn dies nicht gesetzt ist, wird PAGER als Fallback verwendet.

Um Ihr Problem zu lösen, können Sie PAGER und GIT_PAGER in Ihrer Shell deaktivieren.

C-Otto
quelle
1
Das Problem "Nicht gesetzt" PAGER( GIT_PAGERwar nicht gesetzt) ​​ist immer noch vorhanden. Gibt es einen Ort, an dem ich diese Umgebung überprüfen muss?
DenniJensen
@DenniJensen Sie können den Pager auf den Befehl wie setzen PAGER= git branch(mit einem Leerzeichen nach und keinem vor dem Gleichheitszeichen genau wie geschrieben). Keine Ahnung, ob es besser ist als zB git branch | cat.
Maaartinus
-1

Ich hatte das gleiche Problem mit git statusund git config --global pager.status falselöse das auch.

Adonis
quelle