Comment empêcher «git diff» d'utiliser un pager?

641

Existe-t-il un commutateur de ligne de commande à passer git diffet d'autres commandes qui utilisent le lesspager par défaut?

Je sais que je peux le diriger vers cat, mais cela supprime toute la coloration syntaxique.

Je sais que je peux définir le pager dans le .gitconfig global sur cat by GITPAGER=cat(ou quelque chose comme ça); mais je veux parfois avoir un téléavertisseur (selon la taille du diff).

Mais, je préférerais un commutateur de ligne de commande s'il y en a un; et je ne suis pas en mesure d'en trouver un, en parcourant les pages de manuel.

Lakshman Prasad
la source
16
Remarque: core.pager 'less -+F -+X'serait un moyen plus récent de supprimer ces options. Voir ma réponse ci-dessous .
VonC
"less - + F - + X" est le réglage magique pour supprimer les marqueurs ennuyeux "... sauter ..." dans les longs journaux. Merci beaucoup pour ces options, vous m'avez sauvé la journée!
Guillaume Perrot
en relation: stackoverflow.com/questions/12352049/…
Trevor Boyd Smith
Voir la question connexe sur l'utilisation lessavec git (cela varie selon la lessversion): unix.stackexchange.com/questions/107315/…
Pierz

Réponses:

692

--no-pagerà Git lui dira de ne pas utiliser de téléavertisseur. Passer l'option -Fpour lui lessindiquera de ne pas paginer si la sortie tient dans un seul écran.

Usage:

git --no-pager diff

Les autres options des commentaires comprennent:

# 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
la source
3
Merci, je suppose que je peux alias git --no-pager pour gitc en .bashrc, non?
Lakshman Prasad
42
Ou utilisez les variables d'environnement GIT_PAGER ou PAGER, ou la variable core.pagergit config.
Jakub Narębski
74
Gardez à l'esprit que vous devez ajouter --add-pager avant votre commande, comme dans "git --no-pager log --format = blah"
Ana Betts
6
De plus, si votre terminal efface l'écran après être sorti moins, vous voudrez ajouter -Eà vos lessoptions pour les rendre -Futilisables.
mgalgs
9
Notez que si vous souhaitez inclure --no-pagerdans un alias, vous devez préfixe de commande, et d'éviter une erreur, vous devez faire un alias comme ceci: git config alias.foo '!git --no-pager foo'. Un peu déroutant. Le simple aliasing '--no-pager foo'ne fonctionnera pas.
Jim Stewart
272

Comme mentionné dans une réponse précédente, la transmission de l' -Foption à la lessfait se fermer si le contenu est inférieur à un écran. Cependant, après cela, l'écran est réinitialisé et vous finissez par ne pas voir le contenu.

L' -Xoption supprime ce comportement. Donc, j'utilise ce qui suit pour activer la pagination conditionnelle en fonction de la quantité de contenu:

git config --global --replace-all core.pager "less -F -X"
ishaaq
la source
46
Remarque: j'ai dû utiliser git config --global --add core.pager "less -F -X"git 1.8.0.2, celui ci-dessus n'a pas fonctionné.
Dogbert
7
Génial! Aussi, pour qu'il se comporte donc non seulement avec git, mais tous les programmes ajoutent quelque chose comme export LESS="-RFX"à votre .bashrcou.zshrc
defhlt
Merci pour ça; J'ai été en proie à une option dans laquelle git tronquerait la première ligne de la sortie, puis se désynchroniserait de telle sorte qu'en descendant d'une ligne puis en remontant d'une ligne, la 1ère ligne du correct occuperait le haut, suivi de la 3e ligne de la sortie correcte. Quoi qu'il en soit, la spécification de cette option a résolu ce problème. Tellement bizarre.
Tim Harper
Si vous utilisez Git pour Windows (qui utilise moins construit par Greenwood Software), le paramètre dont vous avez besoin est -E (source: greenwoodsoftware.com/less/faq.html#dashe )
Gavin Ward
1
Oui, comme je l'ai expliqué dans ma réponse, je préfère que l'écran ne soit pas réinitialisé avant et après le démarrage et la fermeture du téléavertisseur, surtout s'il tient dans un seul écran, ce qui est exactement ce qui se -Xpasse. Ne l'utilisez pas si vous n'aimez pas ça. Je l'aime parce que de cette façon, je peux me référer à des choses comme git SHA en regardant le résultat des commandes git précédentes dans mon historique sans avoir à taper à nouveau la commande. Chacun à sa façon.
ishaaq
169

Utilisation

git config --global core.pager cat

se débarrasser d'un pager pour toutes les commandes de tous les référentiels.

Vous pouvez également désactiver la pagination pour les sous-commandes Git uniques en utilisant pager.<cmd>setting au lieu de core.pager, et vous pouvez modifier vos paramètres par référentiel Git (omis --global).

Voir man git-configet rechercher pager.<cmd>des détails.

geekQ
la source
La question n'était pas de savoir comment désactiver complètement le pager, mais comment le désactiver pour la sous-commande grep. La réponse de mtahmed est parfaite.
TilmanBaumann
9
C'est peut-être ce que l'explication détaillée a demandé, mais c'est ce que je cherchais et c'était l'un des meilleurs résultats de Google, donc merci @geekQ
Brian F Leighty
70

Les récents changements dans la documentation mentionnent une manière différente de supprimer une option par défaut pour less(les "options par défaut" étant FRSX).

Pour cette question, ce serait (git 1.8+)

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

Par exemple, Dirk Bester suggère dans les commentaires :

export LESS="$LESS -FRXK" 

de sorte que je reçois une couleur diff avec Ctrl-Cquitter less.

Wilson F mentionne dans les commentaires et dans sa question que:

moins prend en charge le défilement horizontal, donc lorsque les lignes sont coupées, moins désactive la sortie si écran unique afin que l'utilisateur puisse toujours faire défiler le texte vers la gauche pour voir ce qui a été coupé.


Ces modifications étaient déjà visibles dans git 1.8.x, comme illustré dans " Toujours utiliser le pager pourgit diff " (voir les commentaires). Mais la documentation vient d'être reformulée ( pour git 1.8.5 ou 1.9, Q4 2013 ).

Visionneuse de texte à utiliser par les commandes Git (par exemple, «moins»).
La valeur est destinée à être interprétée par le shell.

L'ordre de préférence est le suivant:

  • la $GIT_PAGERvariable d'environnement,
  • puis core.pagerconfiguration,
  • alors $PAGER,
  • puis la valeur par défaut choisie au moment de la compilation (généralement «moins»).

Lorsque la LESSvariable d'environnement n'est pas définie, Git la définit sur FRSX
(si LESSla variable d'environnement est définie, Git ne la modifie pas du tout).

Si vous souhaitez remplacer de manière sélective le paramètre par défaut de Git LESS, vous pouvez définir core.pagerpar exempleless -+S .
Cela sera transmis au shell par Git, qui traduira la commande finale en LESS=FRSX less -+S. L'environnement indique à la commande de définir l' Soption de couper les lignes longues mais la ligne de commande la réinitialise à la valeur par défaut pour replier les lignes longues.


Voir commit 97d01f2a pour la raison de la nouvelle formulation de la documentation:

config: réécrire la core.pagerdocumentation

Le texte mentionne core.pageret GIT_PAGERsans donner le tableau d'ensemble de la préséance. Empruntez une meilleure description de la documentation git var(1) .

L'utilisation du mécanisme pour autoriser les fichiers de configuration à l'échelle du système, globaux et par référentiel n'est pas limitée à cette variable particulière. Supprimez-le pour clarifier le paragraphe.

Réécrivez la partie qui explique comment la variable d'environnement LESSest définie sur la valeur par défaut de Git et comment la personnaliser de manière sélective.


Remarque: commit b327583 ( Matthieu Moymoy , avril 2014, pour git 2.0.x / 2.1, Q3 2014) supprimera le S par défaut:

pager: supprimer "S" de $ LESS par défaut

Par défaut, Git utilisé pour définir $LESSà -FRSXsi $LESSn'a pas été défini par l'utilisateur.
Les FRXindicateurs ont en fait un sens pour Git ( Fet Xparce que parfois les tuyaux Git de sortie à moins sont courts, et Rparce que les tuyaux Git ont une sortie colorée).
Le Sdrapeau (couper les longues lignes), d'autre part, n'est pas lié à Git et est une question de préférence de l'utilisateur. Git ne devrait pas décider que l'utilisateur change LESSla valeur par défaut .

Plus précisément, l' Sindicateur nuit aux utilisateurs qui examinent le code non approuvé dans un pageur, car un correctif ressemblant à:

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

semble identique à:

-old code;
+new good code;

Les utilisateurs qui préfèrent l'ancien comportement peuvent toujours définir -FRSXexplicitement la variable d'environnement $ LESS ou définir core.pager sur ' less -S'.

La documentation se lira:

L'environnement ne définit pas l' Soption mais la ligne de commande le fait, demandant à moins de tronquer les longues lignes.
De même, la définition core.pagerde less -+Fdésactivera l' Foption spécifiée par l'environnement à partir de la ligne de commande, désactivant le quit if one screencomportement " " de less.
On peut spécifiquement activer certains drapeaux pour des commandes particulières: par exemple, le réglage pager.blamesur less -Sactive la troncature de ligne uniquement pour git blame.

VonC
la source
2
Merci merci! Je cherchais un moyen de faire en sorte que git arrête de couper de longues lignes pendant des mois!
coredumperror
@CoreDumpError note: le prochain Git (2.0.X ou 2.1) ne coupera pas la ligne par défaut ! Voir ma réponse modifiée ci-dessus.
VonC
2
Merci. Cela m'a permis de comprendre que je veux exporter LESS = "$ LESS -FRXK" pour que je reçoive une différence de couleur avec ctrl-c quitter à partir de moins.
Dirk Bester
@DirkBester Suggestion intéressante. Je l'ai inclus dans la réponse pour plus de visibilité.
VonC
1
@WilsonF Je ne sais pas, mais cela ressemble à une bonne question: pourquoi ne pas en faire une question au lieu de la laisser ici, enterrée dans les commentaires?
VonC
58

Vous pouvez également désactiver / activer les pagers pour des sorties spécifiques dans la configuration globale:

git config --global pager.diff false

Ou pour définir l'option core.pager, fournissez simplement une chaîne vide:

git config --global core.pager ''

C'est mieux à mon avis que de le régler catcomme vous le dites.

mtahmed
la source
C'est ce qui a fonctionné pour moi sur Git 1.9 ... tout le reste n'a pas fonctionné.
Jordon Bedwell
C'est celui qui a fonctionné pour moigit version 2.5.4 (Apple Git-61)
Ashley Coolman
C'est ce que je voulais parce que d'autres commandes désactivent complètement le pager, mais c'est la seule réponse qui ne se désactive que pendant git diffqu'il fonctionne pour d'autres commandes
SingleNegationElimination
au moment d'écrire ces lignes ... sur Windows / PowerShell, j'ai dû modifier code "$($env:UserProfile)\.gitconfig"et ajouter manuellement pager = sous les [core]paramètres. La réponse a fonctionné pour ma session PowerShell actuelle, mais ne semble pas enregistrer le paramètre n'importe où, donc il était efficace lors du prochain lancement.
Aucun remboursement Aucun retour
12

Concernant la couleur désactivée lors de la tuyauterie:

Utilisez --colorpour éviter que la coloration soit désactivée.

git diff --color | less -R

Ou configurez-le forcé (par exemple .gitconfig):

[color]
        ui = on

git diff | less -R

Pour les outils non colorés, utilisez alors:

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

L'exportation de la variable d'environnement LESS=-R(par exemple .bashrc) active la prise en charge des couleurs par défaut dans "moins":

git diff | less

StellarVortex
la source
2
Notez que git définira la LESSvariable d'environnement FRSXlors de l'appel du pager, s'il n'est pas défini.
tobbez
10

Cela a fonctionné pour moi avec Git version 2.1.4 sur Linux:

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

Cela fait utiliser Git à la catplace de less. catvide simplement la sortie de diffl'écran sans pagination.

jcoffland
la source
Généralement, les réponses sont beaucoup plus utiles si elles incluent une explication de ce que le code est censé faire et pourquoi cela résout le problème sans en introduire d'autres. (Ce message a été signalé par au moins un utilisateur, probablement parce qu'ils pensaient qu'une réponse sans explication devrait être supprimée.)
Nathan Tuggy
3
@NathanTuggy Je pensais qu'il était assez clair que je répondais à la question posée. On dirait que certains utilisateurs aiment courir en signalant les réponses courtes pour le plaisir. Je vais ajouter du texte.
jcoffland
7

Vous pouvez ajouter un alias à diff avec son propre pager avec pager.alias, comme ceci:

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

Cela gardera la couleur et utilisera 'cat' comme pager lorsqu'il sera invoqué à 'git dc'.

Aussi, les choses à ne pas faire:

  • utiliser --no-pagerdans votre alias. Git (1.8.5.2, Apple Git-48) se plaindra que vous essayez de modifier l'environnement.
  • utiliser un shell avec !shou !git. Cela contournera l'erreur d'environnement ci-dessus, mais cela réinitialisera votre répertoire de travail (aux fins de cette commande) dans le répertoire Git de niveau supérieur, de sorte que toute référence à un fichier local ne fonctionnera pas si vous êtes déjà dans un sous-répertoire de votre référentiel.
Joseph Cheek
la source
+1 Cette technique est utile lorsque vous souhaitez naviguer par commit après git logmais pas git log --oneline. Utilisez pager.log = less -FXR +/^commit.*, en cas spécial, l' --onelineoption avec alias.l1 = log --onelineet pager.l1 = less -FXR.
Claudio
6

J'ai ce morceau dans mon .gitconfiget il semble bien fonctionner (désactivé pour diff et show):

[pager]
    diff = false
    show = false
sekmo
la source
5

J'aime désactiver la pagination de temps en temps, quand je sais que la sortie n'est pas très longue. Pour cela, j'ai trouvé une astuce en utilisant des alias Git:

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

Ou ajoutez ce qui suit à la [alias]section ~ / .gitconfig:

n = !git --no-pager

Cela signifie que vous pouvez utiliser le préfixe npour désactiver la pagination pour n'importe quelle commande Git, c'est-à-dire:

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
la source
2

Pour un script rapide et sale que j'ai écrit, je l'ai fait de cette façon:

PAGER=cat git diff ...
Roberto Bonvallet
la source
Cela ne fonctionnera pas si $GIT_PAGERest défini. git --no-pagerfait de même mais de manière plus fiable.
Matthieu Moy
2

Comme il est dit sur man git , vous pouvez utiliser --no-pagern'importe quelle commande.

Je l'utilise sur:

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

Utilisez ensuite un alias pour éviter d'utiliser (et de vous souvenir) des commandes longues.

Est Ma
la source
2

Pour Windows, c'est:

git config --global core.pager ""

Cela désactivera la pagination pour tout git, y compris le super ennuyeux git branch.

Jaredcheeda
la source
Fonctionne aussi avec Linux!
rustysys-dev
2

Si vous utilisez oh-my-zsh, dans le ~/.oh-my-zsh/lib/misc.zshfichier, commentez cette ligne:

env_default 'LESS' '-R'
pluie lente
la source
Hé, je pense que l'OP voulait avoir un commutateur de ligne de commande pour utiliser une seule fois avec git diff, plutôt qu'une solution globale permanente. De plus, je ne sais pas à quel point il serait bon de modifier le code source oh-my-zsh, car il serait difficile de mettre à jour oh-my-zsh plus tard. Mieux vaut définir cette valeur par défaut sur votre fichier .zshrc.
Karri Rasinmäki
1
Merci, vous avez raison. Si vous utilisez oh-my-zsh et avez besoin d'une solution globale permanente, vous pouvez ajouter unset LESSà la fin du .zshrc.
pluie lente le
1

Par défaut, git uses utilise moins comme pager. Je préfère normalement plus, car il imprimera la première page et vous permettra ensuite de faire défiler le contenu.

De plus, le contenu restera dans la console une fois terminé. Ceci est généralement pratique, car vous voulez souvent faire quelque chose avec le contenu après la recherche (par exemple, envoyer un e-mail au responsable et lui dire qu'il a introduit un bogue dans son dernier commit).

Si vous souhaitez ensuite canaliser le contenu, il serait gênant de faire défiler pour tout imprimer. La bonne chose avec plus est que vous serez en mesure de le combiner avec un pipeline et il sera tout au long, par exemple.

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

Fondamentalement, c'est tout ce dont vous auriez besoin, sauf si vous ne voulez pas que le contenu reste dans la console une fois terminé. Pour en utiliser davantage, procédez comme suit.

git config --global core.pager 'more'
patrik
la source
0
git -P diff

Ou --no-pager.

BTW: Pour conserver la couleur avec le chat

git diff --color=always | cat
hyperpallium
la source
0

Suivez simplement les instructions ci-dessous.

  1. Tapez simplement vi ~/.gitconfigvotre terminal.
  2. Coller la LESS="-F -X $LESS"ligne.
  3. Appuyez :wqet entrez.
  4. Redémarrez votre terminal.
Nitish
la source