¿Cómo evito que 'git diff' use un buscapersonas?


641

¿Hay un interruptor de línea de comando para pasar git diffy otros comandos que usan el lessbuscapersonas por defecto?

Sé que puedo canalizarlo a cat, pero eso elimina todo el resaltado de sintaxis.

Sé que puedo configurar el localizador en el .gitconfig global para cat by GITPAGER=cat(o algo así); pero quiero tener buscapersonas a veces (dependiendo del tamaño de la diferencia).

Pero, preferiría un cambio de línea de comando si hay uno; y no puedo encontrar uno, revisando las páginas del manual.


16
Nota: core.pager 'less -+F -+X'sería una forma más reciente de eliminar esas opciones. Vea mi respuesta a continuación .
VonC

"menos - + F - + X" es la configuración mágica para eliminar los molestos marcadores "... omitiendo ..." en los registros largos. Muchas gracias por esas opciones, me salvaste el día!
Guillaume Perrot


Consulte la pregunta relacionada sobre el uso lesscon git (varía según la lessversión): unix.stackexchange.com/questions/107315/…
Pierz

Respuestas:


692

--no-pagera Git le dirá que no use un buscapersonas. Pasando la opción-F a, lessle indicará que no busque si la salida cabe en una sola pantalla.

Uso:

git --no-pager diff

Otras opciones de los comentarios incluyen:

# 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

3
Gracias, supongo que puedo alias git --no-pager to gitc en .bashrc, ¿verdad?
Lakshman Prasad

42
O use las variables de entorno GIT_PAGER o PAGER, o la core.pagervariable de configuración git.
Jakub Narębski

74
Tenga en cuenta que debe agregar --add-pager antes de su comando, como en "git --no-pager log --format = blah"
Ana Betts

66
Además, si su terminal borra la pantalla después de salir menos, querrá agregar -Ea sus lessopciones para que se -Fpueda usar.
mgalgs

99
Tenga en cuenta que si desea incluir --no-pagerun alias, debe prefijar el comando con él y, para evitar un error, debe crear un alias como este:git config alias.foo '!git --no-pager foo' . Algo confuso. Simplemente aliasing '--no-pager foo'no funcionará.
Jim Stewart

272

Como se mencionó anteriormente, pasar la -Fopción a lesshace que se cierre si el contenido es inferior a una pantalla. Sin embargo, después de hacerlo, la pantalla se reinicia y terminas sin ver el contenido.

La -Xopción elimina ese comportamiento. Por lo tanto, uso lo siguiente para habilitar la paginación condicional en función de la cantidad de contenido:

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

46
Nota: tuve que usar git config --global --add core.pager "less -F -X"en git 1.8.0.2, el anterior no funcionó.
Dogbert el

77
¡Excelente! También para que se comporte de manera que no solo con git sino que todos los programas agreguen algo como export LESS="-RFX"a su .bashrco.zshrc
defhlt

Gracias por esto; Me ha plagado una opción en la que git truncaría la primera línea de la salida y luego se desincronizaría de tal manera que bajar una línea y luego una línea hacia arriba causaría que la primera línea de la correcta ocupara la parte superior, seguido de la tercera línea desde la salida correcta. De todos modos, la especificación de esta opción resolvió ese problema. Tan extraño
Tim Harper

Si usa Git para Windows (que usa menos software creado por Greenwood Software), el parámetro que necesita es -E (fuente: greenwoodsoftware.com/less/faq.html#dashe )
Gavin Ward

1
Sí, como expliqué en mi respuesta, prefiero que la pantalla no se reinicie antes y después de que el buscapersonas se inicie y salga, especialmente si todo cabe en una pantalla, que es exactamente lo que -Xhace. No lo uses si no te gusta eso. Me gusta porque de esta manera puedo referirme a cosas como SHA git mirando el resultado de comandos git anteriores en mi historial sin tener que volver a escribir el comando. Cada uno a lo suyo.
ishaaq

169

Utilizar

git config --global core.pager cat

para deshacerse de un buscapersonas para todos los comandos para todos los repositorios.

También puede deshabilitar la paginación para subcomandos Git individuales mediante el uso de la pager.<cmd>configuración en lugar de core.pager, y puede cambiar su configuración por repositorio de Git (omitir--global ).

Ver man git-configy buscar pager.<cmd>detalles.


La pregunta no era cómo deshabilitar el buscapersonas por completo, sino cómo deshabilitarlo para el subcomando grep. La respuesta de mtahmed es perfecta.
TilmanBaumann

99
Esto podría ser lo que pedía la explicación extendida, pero esto es lo que estaba buscando y fue uno de los mejores resultados de Google, así que gracias @geekQ
Brian F Leighty

70

Los cambios recientes en la documentación mencionan una forma diferente de eliminar una opción predeterminada para less (ser "opciones predeterminadas" FRSX).

Para esta pregunta, esto sería (git 1.8+)

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

Por ejemplo, Dirk Bester sugiere en los comentarios :

export LESS="$LESS -FRXK" 

para que tenga color diff con Ctrl-C quit from less.

Wilson F menciona en los comentarios y en su pregunta que:

menos admite el desplazamiento horizontal, por lo que cuando las líneas se cortan, menos deshabilita la pantalla para dejar de fumar si el usuario todavía puede desplazar el texto hacia la izquierda para ver qué se cortó.


Esas modificaciones ya eran visibles en git 1.8.x, como se ilustra en " Usar siempre el localizador paragit diff " (ver los comentarios). Pero la documentación se volvió a redactar ( para git 1.8.5 o 1.9, Q4 2013 ).

Visor de texto para uso de los comandos de Git (por ejemplo, 'menos').
El valor debe ser interpretado por el shell.

El orden de preferencia es:

  • la $GIT_PAGER variable de entorno,
  • entonces core.pager configuración,
  • entonces $PAGER ,
  • y luego el valor predeterminado elegido en tiempo de compilación (generalmente 'menos').

Cuando la LESSvariable de entorno no está establecida, Git la establece en FRSX
(siLESS la variable de entorno está configurada, Git no la cambia en absoluto).

Si desea anular selectivamente la configuración predeterminada de Git para LESS, se puede establecer core.pagerque, por ejemploless -+S .
Git lo pasará al shell, que traducirá el comando final a LESS=FRSX less -+S. El entorno le dice al comando que establezcaS opción de cortar líneas largas, pero la línea de comando lo restablece al valor predeterminado para doblar líneas largas.


Ver commit 97d01f2a para conocer el motivo detrás de la nueva redacción de documentación:

config: reescribir core.pager documentación

El texto menciona core.pagery GIT_PAGERsin dar la imagen general de precedencia. Pida prestada una mejor descripción de la git var(1) documentación.

El uso del mecanismo para permitir archivos de configuración globales, globales y por repositorio no se limita a esta variable en particular. Eliminarlo para aclarar el párrafo.

Vuelva a escribir la parte que explica cómo la variable de entorno LESSse establece en el valor predeterminado de Git y cómo personalizarla selectivamente.


Nota: commit b327583 ( Matthieu Moymoy , abril de 2014, para git 2.0.x / 2.1, Q3 2014) eliminará la S por defecto:

buscapersonas: elimina 'S' de $ LESS de forma predeterminada

Por defecto, Git solía establecerse $LESSen -FRSXsi $LESSno fue configurado por el usuario.
Las FRXbanderas realmente tienen sentido para Git ( Fy Xporque a veces la salida de Git canaliza a menos es corta, y Rporque Git canaliza la salida de color).
La Sbandera (cortar líneas largas), por otro lado, no está relacionada con Git y es una cuestión de preferencia del usuario. Git no debería decidir que el usuario cambie LESSel valor predeterminado .

Más específicamente, la Sbandera perjudica a los usuarios que revisan el código no confiable dentro de un localizador, ya que un parche se ve así:

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

parecería idéntico a:

-old code;
+new good code;

Los usuarios que prefieren el comportamiento anterior aún pueden configurar la variable de entorno $ LESS -FRSXexplícitamente o configurar core.pager en ' less -S'.

La documentación leerá:

El entorno no establece la Sopción, pero la línea de comando sí, indicando menos para truncar líneas largas.
Del mismo modo, establecer core.pagera less -+Fdesactivará la Fopción especificada por el entorno desde la línea de comandos, desactivando el " quit if one screen" comportamiento de less.
Uno puede activar específicamente algunos indicadores para comandos particulares: por ejemplo, configurar pager.blamepara less -Shabilitar el truncamiento de línea solo para git blame.


2
¡Gracias Gracias! ¡He estado buscando una manera de hacer que git deje de cortar largas colas durante MESES!
coredumperror

@CoreDumpError nota: ¡el próximo Git (2.0.X o 2.1) no cortará la línea por defecto ! Vea mi respuesta editada arriba.
VonC

2
Gracias. Esto me permitió descubrir que quiero exportar MENOS = "$ MENOS -FRXK" para que obtenga un color diferente con ctrl-c salir de menos.
Dirk Bester

@DirkBester Sugerencia interesante. Lo he incluido en la respuesta para mayor visibilidad.
VonC

1
@WilsonF No lo sé, pero eso suena como una buena pregunta: ¿por qué no hacer una pregunta en lugar de dejarla aquí, enterrada en los comentarios?
VonC

58

También puede deshabilitar / habilitar buscapersonas para salidas específicas en la configuración global:

git config --global pager.diff false

O para configurar la opción core.pager, solo proporcione una cadena vacía:

git config --global core.pager ''

Esto es mejor en mi opinión que configurarlo catcomo usted dice.


Esto es lo que funcionó para mí en Git 1.9 ... todo lo demás no funcionó.
Jordon Bedwell

Este es el que funcionó para mígit version 2.5.4 (Apple Git-61)
Ashley Coolman

Esto es lo que quería porque otros comandos desactivar el localizador por completo, pero esta es la única respuesta que desactiva sólo para git diffal tiempo que deja de trabajar para otros comandos
SingleNegationElimination

al momento de escribir esto ... en Windows / PowerShell tuve que editar code "$($env:UserProfile)\.gitconfig"y agregar manualmente pager = en la [core]configuración. La respuesta funcionó para mi sesión actual de PowerShell, pero no parecía guardar la configuración en ningún lado, por lo que fue efectiva en el próximo lanzamiento.
Sin reembolsos Sin devoluciones

12

Con respecto al color deshabilitado al canalizar:

Use --colorpara evitar que el color esté deshabilitado.

git diff --color | less -R

O configúrelo forzado (por ejemplo, en gitconfig):

[color]
        ui = on

git diff | less -R

Para herramientas que no sean de color, use:

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

La exportación de la variable de entorno LESS=-R(por ejemplo, en .bashrc) activa el soporte de color de forma predeterminada en "menos":

git diff | less


2
Tenga en cuenta que git establecerá la LESSvariable de entorno FRSXcuando llame al localizador, si no está configurado.
tobbez

10

Esto funcionó para mí con Git versión 2.1.4 en Linux:

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

Esto hace que Git use en catlugar de less. catsimplemente volca la salida diffa la pantalla sin paginación.


En general, las respuestas son mucho más útiles si incluyen una explicación de lo que se pretende que haga el código y por qué eso resuelve el problema sin introducir otros. (Esta publicación fue marcada por al menos un usuario, presumiblemente porque pensaron que debería eliminarse una respuesta sin explicación).
Nathan Tuggy

3
@NathanTuggy Pensé que estaba bastante claro que estaba respondiendo la pregunta que se hacía. Parece que a algunos usuarios les gusta correr marcando respuestas cortas por diversión. Agregaré algo de texto.
jcoffland

7

Puede agregar un alias a diff con su propio localizador con pager.alias, así:

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

Esto mantendrá el color y usará 'cat' como localizador cuando se invoque en 'git dc'.

Además, cosas que no debes hacer:

  • utilizar --no-pager en tu alias. Git (1.8.5.2, Apple Git-48) se quejará de que está intentando modificar el entorno.
  • use una concha con !sho !git. Esto omitirá el error de entorno anterior, pero restablecerá su directorio de trabajo (a los efectos de este comando) al directorio Git de nivel superior, por lo que cualquier referencia a un archivo local no funcionará si ya está en un subdirectorio de tu repositorio

+1 Esta técnica es útil cuando quieres navegar por commit después git logpero no git log --oneline. Use pager.log = less -FXR +/^commit.*, mientras que la --onelineopción de mayúsculas y minúsculas con alias.l1 = log --oneliney pager.l1 = less -FXR.
Claudio

6

Tengo este trozo en mi .gitconfigy parece funcionar bien (deshabilitado tanto para diff como para show):

[pager]
    diff = false
    show = false

5

Me gusta deshabilitar la paginación de vez en cuando, cuando sé que la salida no es muy larga. Para esto, encontré un buen truco usando alias Git:

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

O agregue lo siguiente a la [alias]sección de ~ / .gitconfig:

n = !git --no-pager

Esto significa que puede usar el prefijo npara desactivar la paginación para cualquier comando Git, es decir:

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

2

Para un script rápido y sucio que escribí, lo hice de esta manera:

PAGER=cat git diff ...

Esto no funcionará si $GIT_PAGERestá configurado. git --no-pagerhace lo mismo pero de manera más confiable.
Matthieu Moy

2

Como dice en man git , puedes usar--no-pager en cualquier comando.

Lo uso en:

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

Luego use un alias para evitar usar (y recordar) comandos largos.


2

Para Windows es:

git config --global core.pager ""

Esto desactivará la paginación de todo git, incluido el súper molesto git branch.


¡Funciona también con Linux!
rustysys-dev

2

Si usa oh-my-zsh, en el ~/.oh-my-zsh/lib/misc.zsharchivo, comente esta línea:

env_default 'LESS' '-R'

Oye, creo que el OP quería tener un interruptor de línea de comando para usar una sola vez con git diff, en lugar de una solución global permanente. Además, no sé lo bueno que sería modificar el código fuente de oh-my-zsh, ya que sería difícil actualizar oh-my-zsh más adelante. Mejor establezca ese valor predeterminado en su archivo .zshrc.
Karri Rasinmäki

1
Gracias tienes razon. Si usa el oh-my-zsh y necesita una solución global permanente, puede agregar unset LESSal final del .zshrc.
lluvia lenta el

1

Por defecto, git uses utiliza menos como buscapersonas. Normalmente prefiero más, ya que imprimirá la primera página y luego le permitirá desplazarse por el contenido.

Además, el contenido permanecerá en la consola cuando termine. Esto suele ser conveniente, ya que a menudo desea hacer algo con el contenido después de la búsqueda (por ejemplo, enviar un correo electrónico al encargado y decirle que introdujo un error en su última confirmación).

Si luego desea canalizar el contenido, sería inconveniente desplazarse para imprimir todo. Lo bueno con más es que podrá combinarlo con la tubería y lo canalizará a través de todo, por ejemplo.

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

Básicamente es todo lo que necesitaría, a menos que no desee que el contenido permanezca en la consola cuando termine. Para usar más en su lugar, haga lo siguiente.

git config --global core.pager 'more'

0
git -P diff

O --no-pager.

Por cierto: para preservar el color con el gato

git diff --color=always | cat

0

Simplemente siga las instrucciones a continuación.

  1. Simplemente escriba vi ~/.gitconfigsu terminal.
  2. LESS="-F -X $LESS"Línea de pasta .
  3. Presiona :wqy entra.
  4. Reinicia tu terminal.
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.