La commande de branche Git se comporte comme «moins»

415

Lorsque j'utilise la git branchcommande pour répertorier toutes les branches, je vois la sortie de git branch | less.

La commande git branchest censée afficher une liste de branches, comme lspour les fichiers.

Voici la sortie que j'obtiens:

Entrez la description de l'image ici

Comment obtenir le comportement par défaut de git branch? Qu'est-ce qui cause la sortie paginée?

J'utilise ZSH avec oh_my_zsh(rien pour Git là-dedans), et mon .gitconfigapparence ressemble à ceci:

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

Réponses:

738

Comme mentionné dans les commentaires de la réponse de Mark Adelsberger , il s'agissait d'un changement de comportement par défaut introduit dans Git 2.16 .

Vous pouvez désactiver la sortie paginée pour la git branchdésactiver par défaut avec le pager.branchparamètre de configuration :

git config --global pager.branch false
Zach Schneider
la source
128
C'est une décision étrange et étrange de faire défaut. Je m'attends à ce que mes outils cli unix-y se comportent comme des programmes simples et stupides que vous pouvez chaîner si vous le souhaitez, mais je suppose que la discussion concerne un autre site.
Stragulus
7
@Stragulus Notez que la nouvelle valeur par défaut ne vous empêche pas de chaîner git branchavec autre chose. En utilisant la détection des tuyaux , Git affichera la liste des branches sur stdout dans les commandes git branch > branches.txtou git branch | wc -l.
Rory O'Kane
3
@ RoryO'Kane mais avec pager, j'ai un type supplémentaire ESC/qaprès une simple git branchvérification.
mitnk
23
@mitnk Pas nécessairement. Si votre téléavertisseur l'est less, vous pouvez l'ajouter --no-init --quit-if-one-screenà votre LESSvariable d'environnement, ce qui entraînera lesssimplement l'écriture sur stdout si le texte peut être affiché sans défilement. Voir man lesspour plus de détails.
Rory O'Kane
13
Si vous souhaitez l'ajouter manuellement dans votre fichier de configuration, c'est [pager] branch = false(sur deux lignes).
Sam
56

Comme d'autres réponses l'ont souligné, Git utilise par défaut la tuyauterie dans un pager ( lesspar défaut) pour la plupart des commandes.

Un point important, cependant, est que lorsque la variable d'environnement LESS n'est pas définie, Git la définit sur FRX , et la conséquence est que le comportement visible par l'utilisateur est le même que si le pager n'était pas utilisé lorsque la sortie de la commande est courte (c'est-à-dire si vous n'avez que peu de succursales). Voir l' homme moins :

-F ou --quit-if-one-screen Entraîne la fermeture
automatique de less si le fichier entier peut être affiché sur le premier écran.

-R ou --RAW-CONTROL-CHARS
[...] Les séquences d'échappement "couleur" ANSI sont sorties sous forme "brute".

-X ou --no-init
Désactive l'envoi des chaînes d'initialisation et de désinitialisation termcap au terminal. Cela est parfois souhaitable si la chaîne de désinitialisation fait quelque chose d'inutile, comme effacer l'écran.

Si vous obtenez le comportement que vous décrivez, il est fort probable que vous ayez $LESSdéfini autre chose, et le désactiver ( unset LESS) éliminerait le problème tout en conservant le comportement de «pageur» pour une sortie longue. Alternativement, vous pouvez activer le comportement pour tout en le conservant $LESStel quel en l'ajoutant à votre .gitconfigfichier:

[core]
    pager = less -FRX

Si vous n'aimez pas vraiment la fonction de pager, vous pouvez la désactiver globalement ou par commande (voir les autres réponses).

Matthieu Moy
la source
40

Ne pas contester la sémantique, mais le comportement que vous obtenez est celui par défaut. C'est pourquoi vous l'obtenez lorsque vous ne demandez pas quelque chose de différent. Par défaut, branch(et de nombreuses autres commandes Git) utilisent un pager lors de l'envoi de la sortie au terminal.

Vous pouvez remplacer cette valeur par défaut en utilisant l' --no-pageroption:

git --no-pager branch

Ou si vous redirigez la sortie vers un fichier, Git devrait détecter qu'il n'écrit pas sur un terminal et ne devrait donc pas utiliser un pager de toute façon. (D'un autre côté, cela suggère un cas d'utilisation de script, auquel cas vous devriez envisager d'utiliser une commande de plomberie comme git for-each-refde préférence à git branch.)

Mark Adelsberger
la source
git --no-pager branchtravaux. Mais comment est-ce réglé? Seule la PAGERvariable d'environnement est définie sur less. Ce n'est pas le comportement par défaut. Tous mes collèges ont une sortie sous forme de liste imprimée sur le terminal.
DenniJensen
Quelle version de git utilisez-vous? Et lequel utilisez vos collègues?
Lasse V. Karlsen
2.16.0! Est-ce une fonctionnalité introduite dans git dans cette version?
DenniJensen
Oui, c'est par défaut maintenant. github.com/git/git/blob/master/Documentation/RelNotes/… Mon collège à côté de moi utilise la même version et n'a pas ce problème :) thx @mark
DenniJensen
1
C'est la réponse la plus supérieure ici, triste qu'il y ait si peu de votes positifs, car j'ai beaucoup défilé pour trouver ce chef-d'œuvre.
codepleb
26

Ce comportement Git était de plus en plus ennuyeux pour moi aussi. J'ai obtenu ma liste de balises lesslorsque je voulais simplement lister des balises par exemple.

On peut contrôler ce comportement également en changeant le Git PAGER par défaut à la catplace de less. Je préfère faire défiler dans iTerm que dans un éditeur. J'aime utiliser l'éditeur quand je veux.

Donc:

git config --global core.pager cat
ionescu77
la source
2
Oui, cela devrait être une réponse valable pour moi
Tura
2
Merci pour l'information. J'admets qu'après quelques mois d'utilisation, j'utilise toujours le chat, mais par exemple lorsque git logje le fais c'est ennuyeux. Je manque juste le comportement d'origine, mais je n'ai pas eu le temps d'améliorer mon flux de travail quotidien dans cette perspective.
ionescu77
Vous gagnez! ... Parfait!
sdlins
2
Notez que cela s'appliquera également à git log...
bagerard
10

Pour ceux qui veulent mettre à jour leur ~/.gitconfigpour résoudre ce problème, cela ressemblerait à ceci:

[pager]
   branch = false
pseudo
la source
chose étrange ici: ce paramètre fonctionnait et depuis quelques jours ce n'est plus le cas, est-ce que quelque chose a changé ou ma configuration n'est-elle pas appliquée?
ConquerorsHaki
@ConquerorsHaki Cette solution fonctionne pour moi avec git v2.17.1 Essayez git config --list --show-originde déboguer quels paramètres sont / ne sont pas définis pour vous / votre système et d'où ( stackoverflow.com/q/12254076/1590950 ).
indivisible il y a
7

La commande de branche Git se comporte comme «moins»

Parce que Git ouvre par défaut la sortie dans le pager (au moins dans Ubuntu). La réponse acceptée remplacera complètement le téléavertisseur, ce qui pourrait ne pas vous plaire si votre sortie est très longue.

Je recommanderais de remplacer le téléavertisseur lesspour qu'il ne "défile" pas moins que la hauteur du terminal.

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

Procédez comme suit:

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

La réponse acceptée semble fausse. Il y a deux problèmes:

  1. Le comportement est en fait différent entre (configuré par défaut) bash et zsh. Le «problème» n'apparaît que sous zsh.
  2. La solution suggérée fera en sorte de git branchne pas toujours utiliser un téléavertisseur, ce qui ne sera pas souhaité lorsqu'il y a beaucoup de sortie.

La vraie raison est que bash et zsh ont des définitions par défaut différentes de LESS: bash ne définit rien, tandis que zsh le définit pour -R. Quand je fais unset LESSen zsh, tout revient à la normale ....

Le -Rcomportement peut toujours être souhaité. Dans ce cas, vous pouvez ajouter les instructions suivantes à votre .zshrc pour que tout fonctionne:

export LESS=-FRX

-F«provoque la fermeture automatique de moins si le fichier entier peut être affiché sur le premier écran». Cependant, -Xdoit être spécifié simultanément, sinon aucune sortie ne sera affichée lorsqu'il y aura moins d'un écran de sortie.

Yongwei Wu
la source
0

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

GIT_PAGER contrôle le programme utilisé pour afficher la sortie multi-page sur la ligne de commande. Si ce n'est pas le cas, PAGER sera utilisé comme solution de rechange.

Pour résoudre votre problème, vous pouvez désactiver PAGER et GIT_PAGER dans votre shell.

C-Otto
la source
1
Le problème non réglé PAGER( GIT_PAGERn'a pas été réglé) est toujours là. Y a-t-il un endroit où je dois vérifier cet envars?
DenniJensen
@DenniJensen Vous pouvez définir le pager sur la commande comme PAGER= git branch(avec un espace après et aucun avant le signe égal exactement comme écrit). Aucune idée, que ce soit mieux que par exemple git branch | cat.
maaartinus
-1

J'ai eu le même problème avec git statuset git config --global pager.status falserésout cela aussi.

Adonis
la source