Como impedir que o 'git diff' use um pager?

640

Existe uma opção de linha de comando para passar git diffe outros comandos que usam o lesspager por padrão?

Eu sei que posso canalizá-lo para gato, mas isso remove todo o destaque da sintaxe.

Eu sei que posso definir o pager no .gitconfig global como cat by GITPAGER=cat(ou algo parecido); mas eu quero ter pager algumas vezes (dependendo do tamanho do diff).

Mas, eu preferiria uma opção de linha de comando, se houver uma; e não consigo encontrar um, percorrendo as páginas de manual.

Lakshman Prasad
fonte
16
Nota: core.pager 'less -+F -+X'seria uma maneira mais recente de remover essas opções. Veja minha resposta abaixo .
VonC 13/09/13
"less - + F - + X" é a configuração mágica para remover os irritantes marcadores "... pulando ..." em troncos longos. Muito obrigado por essas opções, você salvou meu dia!
Guillaume Perrot
relacionado: stackoverflow.com/questions/12352049/…
Trevor Boyd Smith
Veja a pergunta relacionada sobre o uso lesscom o git (varia de acordo com a lessversão): unix.stackexchange.com/questions/107315/…
Pierz

Respostas:

691

--no-pagerpara o Git dirá para ele não usar um pager. Se você passar a opção, -Fnão lessserá necessário paginar se a saída couber em uma única tela.

Uso:

git --no-pager diff

Outras opções dos comentários incluem:

# 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
fonte
3
Obrigado, eu acho que posso alias git --no-pager para gitc em .bashrc, certo?
Lakshman Prasad
42
Ou use variáveis ​​de ambiente GIT_PAGER ou PAGER ou core.pagervariável de configuração git.
Jakub Narębski 02/02/10
74
Tenha em mente que você deve adicionar --add-pager antes de seu comando, como em "git log --no-pager --format = blah"
Ana Betts
6
Além disso, se o seu terminal limpar a tela depois de sair menos, você precisará adicionar -Eàs suas lessopções para torná-lo -Futilizável.
mgalgs
9
Note que se você deseja incluir --no-pagerem um alias, você tem que prefixar o comando com ele, e para evitar um erro, você tem que fazer um alias como este: git config alias.foo '!git --no-pager foo'. Um pouco confuso. Aliasing simples para '--no-pager foo'não funcionará.
Jim Stewart
272

Como uma resposta anterior mencionada, passar a -Fopção lesspara encerrar se o conteúdo for menor que uma tela. No entanto, depois de fazer isso, a tela é redefinida e você não vê o conteúdo.

A -Xopção elimina esse comportamento. Então, eu uso o seguinte para habilitar a paginação condicional com base na quantidade de conteúdo:

git config --global --replace-all core.pager "less -F -X"
ishaaq
fonte
46
Nota: Eu tive que usar git config --global --add core.pager "less -F -X"no git 1.8.0.2, o acima não funcionou.
31413 Dogbert
7
Ótimo! Também para torná-lo comportar-se assim não só com o git, mas todos os programas de adicionar algo como export LESS="-RFX"a sua .bashrcou.zshrc
defhlt
Obrigado por isso; Fui atormentado por uma opção em que o git truncaria a primeira linha da saída e sairia de sincronia, de modo que descer uma linha e subir uma linha faria com que a primeira linha do correto ocupasse a parte superior, seguido pela 3ª linha da saída correta. De qualquer forma, a especificação desta opção resolveu esse problema. Tão bizarro.
Tim Harper
Se usar Git para Windows (que usa menos construído por Greenwood Software), o parâmetro que você precisa é -E (fonte: greenwoodsoftware.com/less/faq.html#dashe )
Gavin Ward
1
Sim, como expliquei na minha resposta, prefiro que a tela não seja redefinida antes e depois que o pager inicie e saia, especialmente se tudo couber em uma tela, e é exatamente -Xisso que acontece. Não use se você não gosta disso. Gosto porque desta maneira posso me referir a coisas como SHAs do git olhando o resultado dos comandos git anteriores no meu histórico sem precisar digitar o comando novamente. Cada um na sua.
Ishaaq
169

Usar

git config --global core.pager cat

livrar-se de um pager para todos os comandos para todos os repositórios.

Você também pode desativar a paginação para subcomandos Git únicos usando a pager.<cmd>configuração em vez de core.pagere pode alterar suas configurações por repositório Git (omitir --global).

Veja man git-confige procure pager.<cmd>por detalhes.

geekQ
fonte
A questão não era como desabilitar o pager por completo, mas como desabilitá-lo para o subcomando grep. A resposta de mtahmed é perfeita.
TilmanBaumann
9
Este pode ser o que pediu a explicação estendida, mas isso é o que eu estava procurando e foi um dos principais resultados do Google lo graças @geekQ
Brian F Leighty
70

As alterações recentes na documentação mencionam uma maneira diferente de remover uma opção padrão para less(sendo "opções padrão" FRSX).

Para esta pergunta, isso seria (git 1.8+)

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

Por exemplo, Dirk Bester sugere nos comentários :

export LESS="$LESS -FRXK" 

para que eu fique com diff colorido ao Ctrl-Csair de less.

Wilson F menciona nos comentários e em sua pergunta que:

less suporta rolagem horizontal; portanto, quando as linhas são cortadas, menos desativa a opção fechar uma tela para que o usuário ainda possa rolar o texto para a esquerda para ver o que foi cortado.


Essas modificações já estavam visíveis no git 1.8.x, conforme ilustrado em " Sempre use o pager paragit diff " (consulte os comentários). Mas a documentação acabou de ser reformulada ( para git 1.8.5 ou 1.9, quarto trimestre de 2013 ).

Visualizador de texto para uso dos comandos Git (por exemplo, 'less').
O valor deve ser interpretado pelo shell.

A ordem de preferência é:

  • a $GIT_PAGERvariável de ambiente,
  • então core.pagerconfiguração,
  • em seguida $PAGER,
  • e, em seguida, o padrão escolhido no momento da compilação (geralmente 'menos').

Quando a LESSvariável de ambiente está desabilitada, o Git a define FRSX
(se LESSa variável de ambiente estiver definida, o Git não a altera).

Se você deseja substituir seletivamente a configuração padrão do Git LESS, pode definir core.pagerpara, por exemploless -+S .
Isso será passado para o shell pelo Git, que traduzirá o comando final para LESS=FRSX less -+S. O ambiente diz ao comando para definir a Sopção de cortar linhas longas, mas a linha de comando redefine o padrão para dobrar linhas longas.


Consulte commit 97d01f2a para obter o motivo por trás do novo texto da documentação:

config: reescrever a core.pagerdocumentação

O texto menciona core.pagere GIT_PAGERsem fornecer uma imagem geral da precedência. Peça uma descrição melhor da git var(1) documentação.

O uso do mecanismo para permitir arquivos de configuração globais, por repositório e por todo o sistema não se limita a essa variável específica. Remova-o para esclarecer o parágrafo.

Reescreva a parte que explica como a variável de ambiente LESSé definida como o valor padrão do Git e como personalizá-la seletivamente.


Nota: commit b327583 ( Matthieu Moymoy , abril de 2014, para git 2.0.x / 2.1, Q3 2014) removerá o S por padrão:

pager: remova 'S' de $ LESS por padrão

Por padrão, o Git usado para definir $LESSa -FRSXse $LESSnão foi definido pelo usuário.
Os FRXsinalizadores realmente fazem sentido para o Git ( Fe, Xàs vezes, o Git de saída canaliza para menos é curto, e Rporque o Git canaliza saída colorida).
A Sbandeira (cortar linhas longas), por outro lado, não está relacionada ao Git e é uma questão de preferência do usuário. O Git não deve decidir se o usuário altera LESSo padrão .

Mais especificamente, o Ssinalizador prejudica os usuários que revisam código não confiável em um pager, pois um patch é parecido com:

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

pareceria idêntico a:

-old code;
+new good code;

Os usuários que preferem o comportamento antigo ainda podem definir a variável de ambiente $ LESS como -FRSXexplicitamente, ou definir core.pager como ' less -S'.

A documentação irá ler:

O ambiente não define a Sopção, mas a linha de comando, instruindo menos para truncar linhas longas.
Da mesma forma, definir core.pagercomo less -+Fdesativará a Fopção especificada pelo ambiente na linha de comando, desativando o " quit if one screen" comportamento de less.
É possível ativar especificamente alguns sinalizadores para comandos específicos: por exemplo, definir pager.blamepara less -Sativar o truncamento de linha apenas para git blame.

VonC
fonte
2
Obrigado, obrigado! Eu estive procurando uma maneira de fazer o git parar de cortar longas filas por MESES!
Coredumperror
@CoreDumpError note: o próximo Git (2.0.X ou 2.1) não cortará a linha por padrão ! Veja minha resposta editada acima.
VonC
2
Obrigado. Isso permite que eu descubra que eu quero exportar LESS = "$ LESS -FRXK" para que eu fique com diff colorido com ctrl-c sair de less.
Dirk Bester
@DirkBester Sugestão interessante. Eu o incluí na resposta para obter mais visibilidade.
VonC 27/01
1
@ WilsonsonF Eu não sei, mas isso soa como uma boa pergunta: por que não fazer uma pergunta em vez de deixá-la aqui, enterrada nos comentários?
VonC 22/09/2015
58

Você também pode desativar / ativar os pagers para saídas específicas na configuração global:

git config --global pager.diff false

Ou, para definir a opção core.pager, forneça uma string vazia:

git config --global core.pager ''

Isso é melhor na minha opinião do que configurá-lo catcomo você diz.

mtahmed
fonte
Isto é o que funcionou para mim no Git 1.9 ... tudo o resto não funcionou.
Jordon Bedwell
Isso é o que funcionou para mimgit version 2.5.4 (Apple Git-61)
Ashley Coolman
Isto é o que eu queria, porque outros comandos desabilitar o pager completamente, mas esta é a única resposta que desativa apenas para git diffdeixando-o trabalhar para outros comandos
SingleNegationElimination
até o momento em que escrevi ... no Windows / PowerShell, tive que editar code "$($env:UserProfile)\.gitconfig"e adicionar manualmente pager = nas [core]configurações. A resposta funcionou na minha sessão atual do PowerShell, mas não pareceu salvar a configuração em nenhum lugar, pelo que foi eficaz no próximo lançamento.
Sem reembolsos Sem devoluções
12

Em relação à cor desativada ao fazer a tubulação:

Use --colorpara evitar que a cor esteja desativada.

git diff --color | less -R

Ou configure-o forçado (por exemplo, .gitconfig):

[color]
        ui = on

git diff | less -R

Para ferramentas não coloridas, use:

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

A exportação da variável de ambiente LESS=-R(por exemplo, .bashrc) ativa o suporte a cores por padrão em "less":

git diff | less

StellarVortex
fonte
2
Observe que o git definirá a LESSvariável de ambiente para FRSXquando chamar o pager, se não estiver definido.
tobbez
10

Isso funcionou para mim com o Git versão 2.1.4 no Linux:

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

Isso faz com que o Git use em catvez de less. catapenas despeja a saída da difftela sem paginação.

jcoffland
fonte
Geralmente, as respostas são muito mais úteis se incluem uma explicação sobre o que o código pretende fazer e por que isso resolve o problema sem a introdução de outros. (Esta mensagem foi marcado por pelo menos um usuário, presumivelmente porque eles achavam uma resposta sem explicação deve ser suprimida.)
Nathan Tuggy
3
@ NathanTuggy, pensei que estava bastante claro que estava respondendo à pergunta. Parece que alguns usuários gostam de correr sinalizando respostas curtas por diversão. Vou adicionar um texto.
Jcoffland # 13/15
7

Você pode adicionar um alias para diferenciar seu próprio pager com pager.alias, da seguinte maneira:

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

Isso manterá a cor ativada e usará 'cat' como pager quando chamado em 'git dc'.

Além disso, coisas a não fazer:

  • use --no-pagerem seu apelido. O Git (1.8.5.2, Apple Git-48) reclamará que você está tentando modificar o ambiente.
  • use uma concha com !shou !git. Isso ignorará o erro de ambiente acima, mas redefinirá seu diretório de trabalho (para os propósitos deste comando) para o diretório Git de nível superior, portanto, qualquer referência a um arquivo local não funcionará se você já estiver em um subdiretório de seu repositório.
Joseph Cheek
fonte
+1 Esta técnica é útil quando você deseja navegar por confirmar depois, git logmas não git log --oneline. Use pager.log = less -FXR +/^commit.*, enquanto especifica a --onelineopção com alias.l1 = log --onelinee pager.l1 = less -FXR.
Claudio
6

Eu tenho esse pedaço no meu .gitconfige parece funcionar bem (desativado para diff e show):

[pager]
    diff = false
    show = false
sekmo
fonte
5

Eu gosto de desativar a paginação de tempos em tempos, quando sei que a saída não é muito longa. Para isso, achei um truque interessante usando aliases do Git:

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

Ou adicione o seguinte à [alias]seção ~ / .gitconfig:

n = !git --no-pager

Isso significa que você pode usar o prefixo npara desativar a paginação para qualquer comando Git, ou seja:

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

Para um script rápido e sujo que escrevi, fiz desta maneira:

PAGER=cat git diff ...
Roberto Bonvallet
fonte
Isso não funcionará se $GIT_PAGERestiver definido. git --no-pagerfaz o mesmo, mas com mais confiabilidade.
Matthieu Moy
2

Como diz o man git , você pode usar --no-pagerqualquer comando.

Eu uso em:

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

Em seguida, use um alias para evitar o uso (e a lembrança) de comandos longos.

Is Ma
fonte
2

Para Windows é:

git config --global core.pager ""

Isso desativará a paginação de tudo em git , incluindo o que é super irritante git branch.

Jaredcheeda
fonte
Também funciona com Linux!
rustysys-dev 16/03
2

Se você usar o oh-my-zsh, no ~/.oh-my-zsh/lib/misc.zsharquivo, comente esta linha:

env_default 'LESS' '-R'
chuva lenta
fonte
Ei, acho que o OP queria ter uma opção de linha de comando para usar o tempo único com o git diff, em vez de uma solução global permanente. Além disso, não sei como seria bom modificar o código fonte oh-my-zsh, pois seria difícil atualizar o oh-my-zsh posteriormente. Melhor definir esse valor padrão no seu arquivo .zshrc.
Karri Rasinmäki
1
Obrigado, você está certo. Se você usar o oh-my-zsh e precisar de uma solução global permanente, poderá adicionar unset LESSno final do .zshrc.
slow-rain
1

Por padrão, o git usa menos como pager. Normalmente, prefiro mais, pois ela imprimirá a primeira página e permitirá que você role pelo conteúdo.

Além disso, o conteúdo permanecerá no console quando terminar. Isso geralmente é conveniente, pois você costuma fazer algo com o conteúdo após a pesquisa (por exemplo, envie um e-mail ao commiter e diga a ele que ele introduziu um bug em seu último commit).

Se você deseja canalizar o conteúdo, seria inconveniente rolar para imprimir tudo. A coisa boa com mais é que você será capaz de combiná-lo com o pipeline e ele passará por tudo, por exemplo.

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

Basicamente, é tudo o que você precisa, a menos que você não queira que o conteúdo permaneça no console quando terminar. Para usar mais, faça o seguinte.

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

Or --no-pager.

BTW: Para preservar a cor com gato

git diff --color=always | cat
hiperpálio
fonte
0

Basta seguir as instruções abaixo.

  1. Basta digitar vi ~/.gitconfigseu terminal.
  2. Cole LESS="-F -X $LESS"linha.
  3. Pressione :wqe entre.
  4. Reinicie seu terminal.
Nitish
fonte