Wie verhindere ich, dass 'git diff' einen Pager verwendet?

636

Gibt es einen Befehlszeilenschalter, an den übergeben werden kann, git diffund andere Befehle, die lessstandardmäßig den Pager verwenden?

Ich weiß, dass ich es an cat weiterleiten kann, aber dadurch werden alle Syntaxhervorhebungen entfernt.

Ich weiß, dass ich den Pager in der globalen .gitconfig auf cat by GITPAGER=cat(oder so ähnlich) setzen kann. aber ich möchte manchmal Pager haben (abhängig von der Größe des Diff).

Aber ich würde einen Befehlszeilenschalter bevorzugen, wenn es einen gibt; und ich bin nicht in der Lage, einen zu finden, der durch die Manpages geht.

Lakshman Prasad
quelle
16
Hinweis: Dies core.pager 'less -+F -+X'wäre eine neuere Möglichkeit, diese Optionen zu entfernen. Siehe meine Antwort unten .
VonC
"less - + F - + X" ist die magische Einstellung, um die lästigen "... überspringen ..." - Markierungen in langen Protokollen zu entfernen. Vielen Dank für diese Optionen, Sie haben meinen Tag gerettet!
Guillaume Perrot
Verwandte: stackoverflow.com/questions/12352049/…
Trevor Boyd Smith
Siehe verwandte Fragen zur Verwendung lessmit git (je nach lessVersion unterschiedlich): unix.stackexchange.com/questions/107315/…
Pierz

Antworten:

687

--no-pagerzu Git wird es sagen, keinen Pager zu verwenden. Wenn Sie die Option -Fan übergeben, lesswird die Seite nicht angezeigt, wenn die Ausgabe in einen einzelnen Bildschirm passt.

Verwendungszweck:

git --no-pager diff

Weitere Optionen aus den Kommentaren sind:

# Set an evaporating environment variable to use 'cat' for your pager
GIT_PAGER=cat git diff

# Tells 'less' not to paginate if less than a page
export LESS="-F -X $LESS"
# ...then Git as usual
git diff
Ignacio Vazquez-Abrams
quelle
3
Danke, ich denke ich kann alias git --no-pager to gitc in .bashrc, oder?
Lakshman Prasad
42
Oder verwenden Sie die Umgebungsvariablen GIT_PAGER oder PAGER oder die core.pagerKonfigurationsvariable git.
Jakub Narębski
74
Denken Sie daran, dass Sie --add-pager vor Ihrem Befehl hinzufügen müssen , wie in "git --no-pager log --format = blah"
Ana Betts
6
Wenn Ihr Terminal nach weniger Beenden den Bildschirm löscht, möchten Sie -EIhre lessOptionen erweitern, um sie -Fnutzbar zu machen .
Mgalgs
9
Beachten Sie, dass Sie --no-pagerdem Befehl ein Präfix voranstellen müssen , wenn Sie ihn in einen Alias ​​aufnehmen möchten. Um einen Fehler zu vermeiden, müssen Sie einen Alias ​​wie folgt erstellen : git config alias.foo '!git --no-pager foo'. Etwas verwirrend. Einfach Aliasing '--no-pager foo'funktioniert nicht.
Jim Stewart
270

Wie bereits in einer früheren Antwort erwähnt, wird die -FOption zum Übergeben lessbeendet, wenn der Inhalt weniger als einen Bildschirm umfasst. Danach wird der Bildschirm jedoch zurückgesetzt und Sie sehen den Inhalt nicht mehr.

Die -XOption beseitigt dieses Verhalten. Daher verwende ich Folgendes, um das bedingte Paging basierend auf der Menge des Inhalts zu aktivieren:

git config --global --replace-all core.pager "less -F -X"
ishaaq
quelle
46
Hinweis: Ich musste git config --global --add core.pager "less -F -X"in Git verwenden 1.8.0.2, das oben hat nicht funktioniert.
Dogbert
7
Großartig! Auch damit es sich so verhält, nicht nur mit Git, sondern alle Programme fügen so etwas wie export LESS="-RFX"zu Ihrem .bashrcoder.zshrc
defhlt
Danke dafür; Ich bin von einer Option geplagt worden, bei der git die erste Zeile von der Ausgabe abschneidet und dann nicht mehr synchron ist, so dass eine Zeile nach unten und eine Zeile nach oben dazu führt, dass die erste Zeile der richtigen Zeile die oberste belegt. gefolgt von der 3. Zeile aus der richtigen Ausgabe. Durch Angabe dieser Option wurde das Problem behoben. So bizarr.
Tim Harper
Wenn Sie Git für Windows verwenden (das weniger von Greenwood Software erstellt wurde), benötigen Sie den Parameter -E (Quelle: greenwoodsoftware.com/less/faq.html#dashe )
Gavin Ward,
1
Ja, wie ich in meiner Antwort erklärt habe, möchte ich, dass der Bildschirm vor und nach dem Starten und Beenden des Pagers nicht zurückgesetzt wird, insbesondere wenn alles in einen Bildschirm passt, was genau der -XFall ist. Verwenden Sie es nicht, wenn Sie das nicht mögen. Ich mag es, weil ich auf diese Weise auf Dinge wie Git-SHAs verweisen kann, indem ich das Ergebnis früherer Git-Befehle in meinem Verlauf betrachte, ohne den Befehl erneut eingeben zu müssen. Jeder für sich.
Ishaaq
168

Verwenden

git config --global core.pager cat

um einen Pager für alle Befehle für alle Repositorys loszuwerden.

Sie können das Paging für einzelne Git-Unterbefehle auch deaktivieren, pager.<cmd>indem Sie stattdessen die Einstellung anstelle von verwenden core.pager, und Sie können Ihre Einstellungen pro Git-Repository ändern (weglassen --global).

Details anzeigen man git-configund suchen pager.<cmd>.

geekQ
quelle
Die Frage war nicht, wie der Pager insgesamt deaktiviert werden soll, sondern wie er für den Unterbefehl grep deaktiviert werden soll. Die Antwort von mtahmed ist perfekt.
TilmanBaumann
9
Dies könnte die erweiterte Erklärung sein, aber dies ist, wonach ich gesucht habe, und es war eines der besten Google-Ergebnisse. Vielen Dank an @geekQ
Brian F. Leighty,
70

In den letzten Änderungen in der Dokumentation wird eine andere Methode zum Entfernen einer Standardoption für less("Standardoptionen" FRSX) erwähnt.

Für diese Frage wäre dies (Git 1.8+)

git config --global --replace-all core.pager 'less -+F -+X'

Zum Beispiel schlägt Dirk Bester in den Kommentaren vor :

export LESS="$LESS -FRXK" 

so dass ich mit dem Ctrl-CBeenden von farbig diff bekomme less.

Wilson F erwähnt in den Kommentaren und in seiner Frage, dass:

Weniger unterstützt das horizontale Scrollen. Wenn also Zeilen abgeschnitten werden, deaktiviert weniger das Beenden, wenn ein Bildschirm angezeigt wird, sodass der Benutzer den Text weiterhin nach links scrollen kann, um zu sehen, was abgeschnitten wurde.


Diese Änderungen waren bereits in Git 1.8.x sichtbar, wie unter " Verwenden Sie immer den Pager fürgit diff " dargestellt (siehe Kommentare). Die Dokumentation wurde jedoch gerade umformuliert ( für Git 1.8.5 oder 1.9, 4. Quartal 2013 ).

Text-Viewer zur Verwendung durch Git-Befehle (z. B. 'less').
Der Wert soll von der Shell interpretiert werden.

Die Reihenfolge der Präferenzen ist:

  • die $GIT_PAGERUmgebungsvariable,
  • dann core.pagerKonfiguration,
  • dann $PAGER,
  • und dann die zur Kompilierungszeit gewählte Standardeinstellung (normalerweise 'weniger').

Wenn die LESSUmgebungsvariable nicht festgelegt ist, setzt Git sie auf FRSX
(wenn die LESSUmgebungsvariable festgelegt ist, ändert Git sie überhaupt nicht).

Wenn Sie die Standardeinstellung von Git für selektiv überschreiben möchten LESS, können Sie core.pagerzless -+S .
Dies wird von Git an die Shell übergeben, die den endgültigen Befehl in übersetzt LESS=FRSX less -+S. Die Umgebung weist den Befehl an, die SOption zum Hacken langer Zeilen festzulegen, die Befehlszeile setzt sie jedoch auf die Standardeinstellung zurück, um lange Zeilen zu falten.


Siehe Commit 97d01f2a für den Grund für den neuen Wortlaut der Dokumentation:

config: core.pagerDokumentation neu schreiben

Der Text erwähnt core.pagerund GIT_PAGERohne das Gesamtbild der Priorität zu geben. Eine bessere Beschreibung aus der git var(1) Dokumentation ausleihen .

Die Verwendung des Mechanismus zum Zulassen systemweiter, globaler und repositorybezogener Konfigurationsdateien ist nicht auf diese bestimmte Variable beschränkt. Entfernen Sie es, um den Absatz zu verdeutlichen.

Schreiben Sie den Teil neu, in dem erläutert wird, wie die Umgebungsvariable LESSauf den Standardwert von Git gesetzt wird und wie Sie sie selektiv anpassen können.


Hinweis: Commit b327583 ( Matthieu Moymoy , April 2014, für Git 2.0.x / 2.1, Q3 2014) entfernt standardmäßig das S:

Pager: Entfernen Sie standardmäßig 'S' aus $ LESS

Standardmäßig hat Git festgelegt $LESS, -FRSXob dies $LESSnicht vom Benutzer festgelegt wurde.
Die FRXFlags sind für Git tatsächlich sinnvoll ( Fund Xweil manchmal die Ausgabe von Git-Pipes zu kurz ist und Rweil Git-Pipes farbige Ausgabe).
Das SFlag (lange Zeilen hacken) hat dagegen nichts mit Git zu tun und ist eine Frage der Benutzerpräferenz. Git sollte sich nicht dafür entscheiden, dass der Benutzer die LESSStandardeinstellung ändert .

Insbesondere Sschadet das Flag Benutzern, die nicht vertrauenswürdigen Code in einem Pager überprüfen, da ein Patch wie folgt aussieht:

-old code;
+new good code; [... lots of tabs ...] malicious code;

würde identisch erscheinen mit:

-old code;
+new good code;

Benutzer, die das alte Verhalten bevorzugen, können die Umgebungsvariable $ -FRSXLESS weiterhin explizit oder core.pager auf ' less -S' setzen.

Die Dokumentation lautet:

In der Umgebung wird die SOption nicht festgelegt , in der Befehlszeile jedoch weniger, um lange Zeilen abzuschneiden.
In ähnlicher Weise wird durch die Einstellung core.pagerauf less -+Fdie Fvon der Umgebung in der Befehlszeile angegebene Option deaktiviert und das quit if one screenVerhalten von deaktiviert less.
Man kann einige Flags speziell für bestimmte Befehle aktivieren: Zum Beispiel die Einstellung, pager.blameum less -Sdas Abschneiden von Zeilen nur für zu aktivieren git blame.

VonC
quelle
2
Danke Danke! Ich habe nach einer Möglichkeit gesucht, Git dazu zu bringen, keine langen Schlangen mehr für Monate zu hacken!
Coredumperror
@CoreDumpError Hinweis: Der nächste Git (2.0.X oder 2.1) schneidet standardmäßig keine Zeile ! Siehe meine bearbeitete Antwort oben.
VonC
2
Vielen Dank. Dadurch kann ich herausfinden, dass ich LESS = "$ LESS -FRXK" exportieren möchte, damit ich mit Strg-C-Beenden von weniger ein farbiges Diff erhalte.
Dirk Bester
@DirkBester Interessanter Vorschlag. Ich habe es in die Antwort für mehr Sichtbarkeit aufgenommen.
VonC
1
@ WilsonF Ich weiß es nicht, aber das klingt nach einer guten Frage: Warum nicht eine Frage stellen, anstatt sie hier zu lassen, begraben in Kommentaren?
VonC
58

Sie können Pager auch für bestimmte Ausgaben in der globalen Konfiguration deaktivieren / aktivieren:

git config --global pager.diff false

Um die Option core.pager festzulegen, geben Sie einfach eine leere Zeichenfolge ein:

git config --global core.pager ''

Dies ist meiner Meinung nach besser, als es catso einzustellen , wie Sie sagen.

mtahmed
quelle
Das hat bei Git 1.9 für mich funktioniert ... alles andere hat nicht funktioniert.
Jordon Bedwell
Dies ist die, die für mich gearbeitet hatgit version 2.5.4 (Apple Git-61)
Ashley Coolman
Dies ist, was ich wollte, weil andere Befehle den Pager vollständig deaktivieren, aber dies ist die einzige Antwort, die nur deaktiviert wird, git diffwährend es für andere Befehle
funktioniert
Zum Zeitpunkt des Schreibens ... unter Windows / PowerShell musste ich die Einstellungen manuell bearbeiten code "$($env:UserProfile)\.gitconfig"und hinzufügen . Die Antwort funktionierte für meine aktuelle Powershell-Sitzung, schien die Einstellung jedoch nirgendwo zu speichern, sodass sie beim nächsten Start wirksam wurde. pager = [core]
Keine Rückerstattung Keine Rückgabe
12

In Bezug auf die deaktivierte Farbe beim Verrohren:

Verwenden Sie --colordiese Option , um zu vermeiden, dass die Färbung deaktiviert ist.

git diff --color | less -R

Oder konfigurieren Sie es erzwungen (in z. B. .gitconfig):

[color]
        ui = on

git diff | less -R

Verwenden Sie für nicht farbige Werkzeuge:

git diff --no-color | some-primitive-tool

Beim Exportieren von Umgebungsvariablen LESS=-R(z. B. .bashrc) wird die Farbunterstützung standardmäßig in "weniger" aktiviert:

git diff | less

StellarVortex
quelle
2
Beachten Sie, dass git die LESSUmgebungsvariable FRSXbeim Aufrufen des Pagers auf setzt, wenn sie nicht festgelegt ist.
Tobbez
10

Dies funktionierte bei mir mit Git Version 2.1.4 unter Linux:

git config --global --replace-all core.pager cat

Dadurch wird Git catanstelle von verwendet less. catspeichert die Ausgabe einfach diffohne Paging auf dem Bildschirm.

jcoffland
quelle
Im Allgemeinen sind Antworten viel hilfreicher, wenn sie eine Erklärung enthalten, was der Code tun soll und warum dies das Problem löst, ohne andere einzuführen. (Dieser Beitrag wurde von mindestens einem Benutzer markiert, vermutlich weil er dachte, eine Antwort ohne Erklärung sollte gelöscht werden.)
Nathan Tuggy
3
@ NathanTuggy Ich fand es ziemlich klar, dass ich die gestellte Frage beantwortete. Es scheint, als würden einige Benutzer gerne herumlaufen und zum Spaß kurze Antworten markieren. Ich werde einen Text hinzufügen.
Jcoffland
7

Sie können einen Alias ​​hinzufügen, um sich mit einem eigenen Pager mit pager.alias zu unterscheiden, wie folgt:

[alias]
  dc = diff
  dsc = diff --staged
[pager]
  dc = cat
  dsc = cat

Dadurch bleibt die Farbe eingeschaltet und es wird 'cat' als Pager verwendet, wenn 'git dc' aufgerufen wird.

Auch Dinge, die man nicht tun sollte:

  • Verwenden Sie --no-pagerin Ihrem Alias. Git (1.8.5.2, Apple Git-48) beschwert sich, dass Sie versuchen, die Umgebung zu ändern.
  • Verwenden Sie eine Shell mit !shoder !git. Dadurch wird der oben beschriebene Umgebungsfehler umgangen, aber Ihr Arbeitsverzeichnis (für die Zwecke dieses Befehls) wird auf das Git-Verzeichnis der obersten Ebene zurückgesetzt, sodass Verweise auf eine lokale Datei nicht funktionieren, wenn Sie sich bereits in einem Unterverzeichnis von befinden Ihr Repository.
Joseph Cheek
quelle
+1 Diese Technik ist nützlich, wenn Sie nach dem Festschreiben navigieren möchten, git logaber nicht git log --oneline. Verwenden Sie pager.log = less -FXR +/^commit.*, während Sondergehäuse die --onelineOption mit alias.l1 = log --onelineund pager.l1 = less -FXR.
Claudio
6

Ich habe dieses Stück in meinem .gitconfigund es scheint gut zu funktionieren (deaktiviert für Diff und Show):

[pager]
    diff = false
    show = false
sekmo
quelle
4

Ich möchte Paging von Zeit zu Zeit deaktivieren, wenn ich weiß, dass die Ausgabe nicht sehr lang ist. Dafür habe ich einen tollen Trick mit Git-Aliasen gefunden:

git config --global --add alias.n '!git --no-pager'

Oder fügen Sie dem [alias]Abschnitt von ~ / .gitconfig Folgendes hinzu:

n = !git --no-pager

Dies bedeutet, dass Sie das Präfix verwenden können n, um das Paging für jeden Git-Befehl zu deaktivieren, dh:

git n diff # Show the diff without pager
git n log -n 3 # Show the last three commits without pager
git n show v1.1 # Show information about a tag
Daniel Kullmann
quelle
2

Für ein schnelles und schmutziges Skript, das ich geschrieben habe, habe ich es so gemacht:

PAGER=cat git diff ...
Roberto Bonvallet
quelle
Dies funktioniert nicht, wenn $GIT_PAGEReingestellt ist. git --no-pagermacht das gleiche aber zuverlässiger.
Matthieu Moy
2

Wie es auf man git heißt , können Sie es --no-pagerfür jeden Befehl verwenden.

Ich benutze es auf:

git --no-pager diff
git --no-pager log --oneline --graph --decorate --all -n 10

Verwenden Sie dann einen Alias , um zu vermeiden, dass Sie lange Befehle verwenden (und sich daran erinnern).

Ist Ma
quelle
2

Für Windows ist es:

git config --global core.pager ""

Dies schaltet das Paging für alles in aus git, einschließlich des super nervigen in git branch.

Jaredcheeda
quelle
Funktioniert auch mit Linux!
Rustysys-Dev
2

Wenn Sie das oh-my-zsh in der ~/.oh-my-zsh/lib/misc.zshDatei verwenden, kommentieren Sie diese Zeile:

env_default 'LESS' '-R'
langsamer Regen
quelle
Hey, ich denke, das OP wollte einen Befehlszeilenschalter, um Single Time mit Git Diff zu verwenden, anstatt eine permanente globale Lösung. Außerdem weiß ich nicht, wie gut es wäre, den Quellcode von oh-my-zsh zu ändern, da es schwierig wäre, oh-my-zsh später zu aktualisieren. Stellen Sie diesen Standardwert besser in Ihrer .zshrc-Datei ein.
Karri Rasinmäki
1
Danke, du hast recht. Wenn Sie das oh-my-zsh verwenden und eine permanente globale Lösung benötigen, können Sie unset LESSam Ende der .zshrc hinzufügen.
langsamer Regen
1

Standardmäßig verwendet git weniger als Pager. Normalerweise bevorzuge ich mehr, da die erste Seite gedruckt wird und Sie dann durch den Inhalt scrollen können.

Außerdem bleibt der Inhalt in der Konsole, wenn Sie fertig sind. Dies ist normalerweise praktisch, da Sie nach der Suche häufig etwas mit dem Inhalt tun möchten (z. B. dem Commiter eine E-Mail senden und ihm mitteilen, dass er bei seinem letzten Commit einen Fehler eingeführt hat).

Wenn Sie dann Inhalte weiterleiten möchten, ist es unpraktisch, einen Bildlauf durchzuführen, um alles zu drucken. Das Gute an mehr ist, dass Sie es mit einer Pipeline kombinieren können und es durch alles leitet, z.

# Find the commit abcdef123 in the full commit history and read author and commit message
git log |grep -C 5 'abcdef123'

Grundsätzlich ist mehr alles, was Sie jemals brauchen würden, es sei denn, Sie möchten nicht, dass der Inhalt nach Abschluss in der Konsole verbleibt. Um stattdessen mehr zu verwenden, gehen Sie wie folgt vor.

git config --global core.pager 'more'
Patrik
quelle
0
git -P diff

Oder --no-pager.

Übrigens: Um die Farbe mit Katze zu erhalten

git diff --color=always | cat
Hyperpallium
quelle
0

Folgen Sie einfach den Anweisungen unten.

  1. Geben vi ~/.gitconfigSie einfach Ihr Terminal ein.
  2. LESS="-F -X $LESS"Zeile einfügen .
  3. Drücken Sie :wqund geben Sie ein.
  4. Starten Sie Ihr Terminal neu.
Nitish
quelle