O comando Git branch se comporta como 'less'

415

Quando uso o git branchcomando para listar todas as ramificações, vejo a saída de git branch | less.

O comando git branchdeve mostrar uma lista de ramificações, como lsfaz para arquivos.

Esta é a saída que recebo:

Digite a descrição da imagem aqui

Como obtenho o comportamento padrão de git branch? O que causa a saída paginada?

Estou usando o ZSH com oh_my_zsh(nada para o Git lá), e minha .gitconfigaparência é a seguinte:

[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
fonte

Respostas:

738

Como mencionado nos comentários à resposta de Mark Adelsberger , essa foi uma mudança de comportamento padrão introduzida no Git 2.16 .

Você pode git branchdesativar a saída paginada para retorno por padrão com a pager.branchconfiguração :

git config --global pager.branch false
Zach Schneider
fonte
127
Essa é uma decisão estranha e estranha de tornar o padrão. Espero que minhas ferramentas unix-y cli se comportem como programas simples idiotas que você pode encadear, se quiser, mas acho que essa discussão é para outro site.
Stragulus
7
@ Stragulus Observe que o novo padrão não o impede de encadear git branchcom outra coisa. Usando a detecção de pipe , o Git exibirá a lista de ramificações para stdout dentro dos comandos git branch > branches.txtou git branch | wc -l.
Rory O'Kane
3
@ RoryO'Kane, mas com pager, eu tenho um tipo extra ESC/qdepois de uma git branchverificação simples .
mitnk
23
@mitnk Não necessariamente. Se o seu pager for less, você poderá adicionar --no-init --quit-if-one-screenà sua LESSvariável de ambiente, o que fará com lessque apenas escreva no stdout se o texto puder ser exibido sem rolagem. Veja man lesspara mais detalhes.
Rory O'Kane
13
Se você quiser adicioná-lo manualmente ao seu arquivo de configuração, é [pager] branch = false(em duas linhas).
Sam
56

Como outras respostas apontaram, o Git assume como padrão o piper em um pager ( lesspor padrão) para a maioria dos comandos.

Um ponto importante, porém, é que, quando a variável de ambiente LESS está desabilitada, o Git a define como FRX , e a conseqüência é que o comportamento visível do usuário é o mesmo que se o pager não fosse usado quando a saída do comando fosse curta (por exemplo, se você tiver apenas alguns ramos). Veja menos homem :

-F ou - encerrar se uma tela
Faz com que menos saia automaticamente se o arquivo inteiro puder ser exibido na primeira tela.

-R ou --RAW-CONTROL-CHARS
[...] seqüências de escape "cor" ANSI são emitidas na forma "bruta".

-X ou --no-init
Desativa o envio das seqüências de inicialização e desinicialização do termcap para o terminal. Às vezes, isso é desejável se a string de desinicialização fizer algo desnecessário, como limpar a tela.

Se você obtiver o comportamento que você descreve, provavelmente $LESSconfigurou outra coisa e, se desmarcá-lo ( unset LESS), se livraria do problema, mantendo o comportamento do "pager" para uma saída longa. Como alternativa, você pode ativar o comportamento mantendo $LESS-o como está adicionando isso ao seu .gitconfigarquivo:

[core]
    pager = less -FRX

Se você realmente não gosta do pager, pode desativá-lo globalmente ou por comando (consulte outras respostas).

Matthieu Moy
fonte
40

Para não discutir semântica, mas o comportamento que você está recebendo é o padrão. É por isso que você o obtém quando não pede algo diferente. Por padrão, branch(e vários outros comandos Git) usam um pager ao enviar a saída para o terminal.

Você pode substituir esse padrão usando a --no-pageropção:

git --no-pager branch

Ou, se você redirecionar a saída para um arquivo, o Git deve detectar que não está gravando em um terminal e, portanto, não deve usar um pager. (Por outro lado, isso sugere um caso de uso de script, nesse caso, você deve considerar o uso de um comando de encanamento, como git for-each-refpreferencialmente git branch.)

Mark Adelsberger
fonte
git --no-pager branchtrabalho. Mas como é esse cenário? Somente a PAGERvariável de ambiente está definida como less. Este não é o comportamento padrão. Todas as minhas faculdades têm uma saída como uma lista impressa no terminal.
precisa saber é o seguinte
Qual versão do git você está usando? E qual deles seus colegas estão usando?
Lasse V. Karlsen
2.16.0! Esse é um recurso introduzido no git nesta versão?
precisa saber é o seguinte
Sim, é o padrão agora. github.com/git/git/blob/master/Documentation/RelNotes/... Minha faculdade ao meu lado usando a mesma versão e não tem esse problema :) thx @ Marcos
DenniJensen
1
Esta é a resposta mais superior aqui, triste por ter tão poucos votos, porque eu rolei um pouco para encontrar esta obra-prima.
codepleb 5/09/19
26

Esse comportamento do Git também era cada vez mais irritante para mim. Eu recebi minha lista de tags lessquando apenas queria listar tags, por exemplo.

Pode-se controlar esse comportamento também alterando o Git PAGER padrão para em catvez de less. Prefiro rolar no iTerm do que em um editor. Eu gosto de usar o editor quando quiser.

Assim:

git config --global core.pager cat
ionescu77
fonte
2
Sim esta deve ser uma resposta válida para mim
Tura
2
obrigado pelo aviso. Admito que após alguns meses de uso, ainda estou usando o gato, mas, por exemplo, ao fazê- git loglo é irritante. Só sinto falta do comportamento original, mas não tive tempo para melhorar meu fluxo de trabalho diário nesta perspectiva.
ionescu77
Você ganha! ... Perfeito!
Sdlins
2
Observe que isso também será aplicado a git log...
bagerard em 24/02
10

Para aqueles que desejam atualizar seus ~/.gitconfigpara corrigir isso, seria assim:

[pager]
   branch = false
usuario
fonte
coisa estranha aqui: essa configuração estava funcionando e, já que alguns dias não estão mais, algo mudou ou a minha configuração não está sendo aplicada?
ConquerorsHaki
7

O comando Git branch se comporta como 'less'

Como o Git, por padrão, abre a saída no pager (pelo menos no Ubuntu). A resposta aceita substituirá completamente o pager, o que você pode não gostar se sua saída for muito longa.

Eu recomendaria substituir o pager por less, para que ele não "role" as saídas menos que a altura do terminal.

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

Faça o seguinte:

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

A resposta aceita parece errada. Existem dois problemas:

  1. O comportamento é realmente diferente entre o bash (padrão) e o zsh. O 'problema' aparece apenas no zsh.
  2. A solução sugerida git branchnão utilizará sempre um pager, o que não será desejado quando houver muita saída.

A verdadeira razão é que o bash e o zsh têm definições padrão diferentes sobre o LESS: o bash não define nada, enquanto o zsh o define -R. Quando eu faço unset LESSno zsh, tudo volta ao normal ....

O -Rcomportamento ainda pode ser desejado. Nesse caso, você pode adicionar as seguintes instruções ao seu .zshrc para manter tudo funcionando:

export LESS=-FRX

-F'faz com que menos saia automaticamente se o arquivo inteiro puder ser exibido na primeira tela'. No entanto, -Xprecisa ser especificado simultaneamente, caso contrário, nenhuma saída será mostrada quando houver menos de uma tela de saída.

Yongwei Wu
fonte
0

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

GIT_PAGER controla o programa usado para exibir a saída de várias páginas na linha de comando. Se não estiver definido, o PAGER será usado como substituto.

Para resolver seu problema, você pode desabilitar PAGER e GIT_PAGER no seu shell.

C-Otto
fonte
1
O problema de não definido PAGER( GIT_PAGERnão foi definido) ainda está lá. Existe algum local para verificar esses envários?
precisa saber é o seguinte
@DenniJensen Você pode definir o pager no comando como PAGER= git branch(com um espaço depois e nenhum antes dos sinais de igual exatamente como escritos). Não faço ideia, se é melhor do que, por exemplo git branch | cat,.
maaartinus 7/01
-1

Eu tive o mesmo problema git statuse git config --global pager.status falseresolve isso também.

Adônis
fonte