El comando de rama de Git se comporta como 'menos'

415

Cuando uso el git branchcomando para enumerar todas las ramas, veo el resultado de git branch | less.

Se git branchsupone que el comando muestra una lista de ramas, como lo lshace para los archivos.

Este es el resultado que obtengo:

Ingrese la descripción de la imagen aquí

¿Cómo obtengo el comportamiento predeterminado de git branch? ¿Qué causa la salida paginada?

Estoy usando ZSH con oh_my_zsh(nada para Git allí), y mi .gitconfigaspecto es el siguiente:

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

Respuestas:

738

Como se menciona en los comentarios a la respuesta de Mark Adelsberger , este fue un cambio de comportamiento predeterminado introducido en Git 2.16 .

Puede desactivar la salida paginada git branchde forma predeterminada con la pager.branchconfiguración :

git config --global pager.branch false
Zach Schneider
fuente
128
Esa es una decisión extraña, extraña, de hacer el incumplimiento. Espero que mis herramientas unix-y cli se comporten como simples programas tontos que puede encadenar si lo desea, pero supongo que la discusión es para otro sitio.
Stragulus
77
@Stragulus Tenga en cuenta que el nuevo valor predeterminado no le impide encadenar git branchcon otra cosa. Mediante la detección de tuberías , Git generará la lista de ramificaciones para stdout dentro de los comandos git branch > branches.txto git branch | wc -l.
Rory O'Kane
3
@ RoryO'Kane pero con buscapersonas, tengo un tipo extra ESC/qdespués de un simple git branchcheque.
mitnk
23
@mitnk No necesariamente. Si su buscapersonas es less, puede agregar --no-init --quit-if-one-screena su LESSvariable de entorno, lo que hará lessque simplemente escriba en stdout si el texto se puede ver sin desplazarse. Ver man lesspara más detalles.
Rory O'Kane
13
Si desea agregarlo a su archivo de configuración manualmente, es [pager] branch = false(en dos líneas).
Sam
56

Como señalaron otras respuestas, Git se conecta de forma predeterminada a un buscapersonas ( lesspor defecto) para la mayoría de los comandos.

Sin embargo, un punto importante es que cuando la variable de entorno LESS no está configurada, Git la establece en FRX , y la consecuencia es que el comportamiento visible del usuario es el mismo que si el localizador no se usara cuando la salida del comando es corta (es decir, si solo tienes pocas ramas). Ver hombre menos :

-F o --quit-if-one-screen
Causa menos para salir automáticamente si se puede mostrar todo el archivo en la primera pantalla.

-R o --RAW-CONTROL-CHARS
[...] Las secuencias de escape "color" ANSI se emiten en forma "en bruto".

-X o --no-init
Inhabilita el envío de las cadenas de inicialización y desinicialización de termcap al terminal. Esto a veces es deseable si la cadena de desinicialización hace algo innecesario, como borrar la pantalla.

Si obtiene el comportamiento que describe, lo más probable es que haya $LESSestablecido algo más, y desarmarlo ( unset LESS) eliminaría el problema y mantendría el comportamiento de "buscapersonas" para una salida larga. Alternativamente, puede activar el comportamiento mientras se mantiene $LESScomo está agregando esto a su .gitconfigarchivo:

[core]
    pager = less -FRX

Si realmente no le gusta el buscapersonas, puede desactivarlo globalmente o por orden (ver otras respuestas).

Matthieu Moy
fuente
40

No es para discutir la semántica, pero el comportamiento que está obteniendo es el predeterminado. Es por eso que lo obtienes cuando no pides algo diferente. Por defecto, branch(y muchos otros comandos Git) usan un buscapersonas cuando envían la salida al terminal.

Puede anular este valor predeterminado utilizando la --no-pageropción:

git --no-pager branch

O si redirige la salida a un archivo, Git debería detectar que no está escribiendo en un terminal y, por lo tanto, no debería usar un localizador de todos modos. (Por otro lado, eso sugiere un caso de uso de secuencias de comandos, en cuyo caso debería considerar usar un comando de plomería como git for-each-refpreferencia git branch).

Mark Adelsberger
fuente
git --no-pager branchtrabajos. Pero, ¿cómo se establece esto? Solo la PAGERvariable de entorno se establece en less. Este no es el comportamiento predeterminado. Todos mis colegios tienen una salida como una lista impresa en la terminal.
DenniJensen
¿Qué versión de git estás usando? ¿Y cuál están usando tus colegas?
Lasse V. Karlsen
2.16.0! ¿Es esta una característica introducida a git en esta versión?
DenniJensen
Sí, es por defecto ahora. github.com/git/git/blob/master/Documentation/RelNotes/… Mi universidad junto a mí usa la misma versión y no tiene este problema :) thx @mark
DenniJensen
1
Esta es la respuesta más superior aquí, triste porque tiene tan pocos votos a favor, porque me desplacé un poco para encontrar esta obra maestra.
codepleb
26

Este comportamiento de Git fue cada vez más molesto para mí también. Obtuve mi lista de etiquetas lesscuando solo quería listar etiquetas, por ejemplo.

Uno puede controlar este comportamiento también cambiando el Git PAGER predeterminado a en catlugar de less. Prefiero desplazarme en iTerm que en un editor. Me gusta usar el editor cuando quiero.

Entonces:

git config --global core.pager cat
ionescu77
fuente
2
Sí, esta debería ser una respuesta válida para mí
Tura
2
Gracias por el aviso. Admito que después de un par de meses de uso, todavía estoy usando cat, pero, por ejemplo, hacerlo git loges molesto. Simplemente extraño el comportamiento original, pero no tuve tiempo para mejorar mi flujo de trabajo diario en esta perspectiva.
ionescu77
¡Tú ganas! ... ¡Perfecto!
sdlins
2
Tenga en cuenta que esto también se aplicará a git log...
bagerard
10

Para aquellos que quieran actualizar su ~/.gitconfigpara solucionar esto, se vería así:

[pager]
   branch = false
Mella
fuente
algo extraño aquí: esta configuración funcionaba y, como algunos días ya no lo es, ¿cambió algo o mi configuración simplemente no se aplica?
ConquerorsHaki
@ConquerorsHaki Esta solución me funciona con git v2.17.1 Intente git config --list --show-origindepurar qué configuraciones están / no están establecidas para usted / su sistema y desde dónde ( stackoverflow.com/q/12254076/1590950 ).
indivisible hace
7

El comando de rama de Git se comporta como 'menos'

Porque Git por defecto abre la salida en buscapersonas (al menos en Ubuntu). La respuesta aceptada reemplazará por completo el buscapersonas, lo que puede no gustarle si su salida es muy larga.

Recomendaría reemplazar el localizador por less, para que no "desplace" las salidas a menos de la altura del terminal.

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

Haz lo siguiente:

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

La respuesta aceptada parece incorrecta. Hay dos problemas:

  1. El comportamiento es realmente diferente entre (predeterminado configurado) bash y zsh. El 'problema' aparece solo bajo zsh.
  2. La solución sugerida hará que git branchno se use siempre un buscapersonas, lo que no será deseable cuando haya mucha salida.

La verdadera razón es que bash y zsh tienen definiciones predeterminadas diferentes sobre MENOS: bash no define nada, mientras que zsh lo define -R. Cuando lo hago unset LESSen zsh, todo vuelve a la normalidad ...

El -Rcomportamiento aún puede ser deseado. En ese caso, puede agregar las siguientes instrucciones a su .zshrc para que todo funcione:

export LESS=-FRX

-F'hace que menos salga automáticamente si se puede mostrar todo el archivo en la primera pantalla'. Sin embargo, -Xdebe especificarse simultáneamente, de lo contrario, no se mostrará ninguna salida cuando haya menos de una pantalla llena de salida.

Yongwei Wu
fuente
0

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

GIT_PAGER controla el programa utilizado para mostrar la salida de varias páginas en la línea de comando. Si esto no está configurado, PAGER se utilizará como reserva.

Para resolver su problema, puede desarmar PAGER y GIT_PAGER en su shell.

C-Otto
fuente
1
El problema de desarmar PAGER( GIT_PAGERestaba desarmado) sigue ahí. ¿Hay alguna ubicación en la que deba verificar este entorno?
DenniJensen
@DenniJensen Puede configurar el localizador en el comando como PAGER= git branch(con un espacio después y ninguno antes del signo igual exactamente como está escrito). Ni idea, si es mejor que cualquiera, por ejemplo, git branch | cat.
maaartinus
-1

He tenido el mismo problema git statusy lo git config --global pager.status falseresuelve también.

Adonis
fuente