¿Cómo obtengo git diff con contexto completo?

5 minutos de lectura

avatar de usuario
Balki

¿Cómo creo un parche con contexto completo?

Lo intenté --unified=2000que da 2000 líneas de contexto:

git diff --unified=2000 branch master --no-prefix > patch

¿Cómo incluyo todas las líneas en el archivo sin tener que especificar el número máximo de líneas?

  • Publiqué la opción -U para mostrar el archivo completo, como una pregunta separada stackoverflow.com/questions/28727424/…

    –Aleksandr Levchuk

    25 de febrero de 2015 a las 19:05

avatar de usuario
c24w

Este parece funcionar bastante bien:

git diff --no-prefix -U1000

Con la advertencia:

los -U bandera especifica líneas de contexto. Es posible que deba aumentar esto si hay más de 1000 líneas entre sus cambios.

  • los -U La opción que sugieres es la misma que la --unified= opción utilizada por el autor de la pregunta. La única diferencia es que especifica menos líneas de contexto, 1000, que las que usó el autor de la pregunta, 2000. @balki quería saber cómo aumentar el número hasta el infinito, pero sugiere reducir el número a la mitad. ¿Por qué?

    – Sr. Lance E Sloan

    3 mayo 2016 a las 19:31

  • @LS: sí, ahora me doy cuenta, pero lo pasé por alto hace un par de años. Aún así, es un poco más evidente lo que está pasando que en la pregunta y parece ayudar a la extraña persona que aterriza aquí.

    – c24w

    3 mayo 2016 a las 19:38

  • Gracias por esto, también funciona muy bien con git show!

    – Shakeel

    23 mayo 2016 a las 18:38

  • @ c24w De acuerdo, todavía obtengo lo que quiero ver en la pantalla.

    – Chef Faraón

    24 de junio de 2016 a las 14:02

  • los --no-prefix La opción se deshace de los prefijos de destino “/a/” y “/b/” que se muestran de forma predeterminada. (página enlazada)

    – Luckydonald

    18 de diciembre de 2017 a las 9:26


avatar de usuario
Esdras

Sé que esto es antiguo, pero tampoco me gustan las soluciones codificadas, así que probé esto:

git diff -U$(wc -l MYFILE)

Usar -U parece ser la única forma de abordar el problema, pero usar un conteo de líneas promete que funcionará incluso para un pequeño cambio en un archivo muy grande.

  • < no es necesario. git diff -U$(wc -l MYFILE) MYFILE

    – balki

    18 de noviembre de 2016 a las 22:12

  • Gracias @balki, probé tu sugerencia y noté que

    $(wc -l MYFILE)

    se expande al número de líneas seguido del nombre del archivo, por lo que también se puede omitir el segundo uso del nombre del archivo. Estoy actualizando mi respuesta para reflejar esto.

    – Esdras

    22 de noviembre de 2016 a las 17:36

  • Es una diferencia, hay dos versiones del archivo. ¿Qué pasaría si la versión que no está en el disco fuera el doble de larga? ¿No es -U con un número realmente grande realmente más seguro?

    – Eloff

    14 de agosto de 2018 a las 13:29

  • @Eloff, eso es cierto, la mejor manera sería maximizar las longitudes, ya que los números realmente grandes todavía tienen el problema opuesto. Esta solución asume que no se realizaron eliminaciones contiguas mayores que el tamaño de archivo actual en el disco.

    – Esdras

    15 de agosto de 2018 a las 15:17

  • git diff -U$(wc -l MYFILE | awk '{print $1}') MYFILE es una mejor respuesta que analiza correctamente la salida de wc al obtener solo la cantidad de líneas sin espacios en blanco, sin depender de la salida sin comillas de un subshell para crear dos argumentos, y funciona en macOS/BSD.

    – anish patel

    18 de febrero de 2019 a las 20:36


avatar de usuario
VonC

Nota: Anuncio de git1.8.1rc1 (8 de diciembre de 2012) incluye:

Una nueva variable de configuración “diff.context” se puede usar para proporcionar el número predeterminado de líneas de contexto en la salida del parche, para anular el valor predeterminado codificado de forma rígida de 3 líneas.

por lo que podría ayudar, aquí, a generar un contexto más completo.

  • Sin embargo, eso no tiene una opción para decir ‘Todas las líneas en el archivo’

    – balki

    11/12/2012 a las 16:00

  • Sospecho que poniendo un número grande, eso simularía “todas las líneas”

    – VoC

    11 de diciembre de 2012 a las 16:04

  • “Sospecho que poner un número grande simularía ‘todas las líneas'”… excepto cuando no es así y luego las cosas se rompen. Todo es sinónimo de infinito, y un número muy grande es solo eso: un número, no infinito.

    – Trentón

    25/09/2015 a las 19:42

avatar de usuario
yun-wu

Me inspiré y agregué un alias de git.

$ cat ~/.gitconfig | fgrep diff
        df = "!git diff -U$(wc -l \"$1\" | cut -d ' ' -f 1) \"$1\""
$ git df <file>

Actualizar:

Acabo de encontrar que “git df” no funciona a veces, debido al cambio de directorio al ejecutar el alias de git. (Vea que los alias de git operan en el directorio incorrecto). Así que esta es la versión actualizada:

$ cat ~/.gitconfig | fgrep df
        df = "! [ \"$GIT_PREFIX\" != \"\" ] && cd \"$GIT_PREFIX\"; ~/bin/git_df.sh"
$ 
$ cat ~/bin/git_df.sh
#!/bin/bash
for FILE in [email protected]; do
    git diff -U$(wc -l "${FILE}" | cut -d ' ' -f 1) "${FILE}"
done
exit 0

avatar de usuario
Nakilon

Esto funcionó para mí en macOS:

git diff -U$(wc -l main.htm | xargs)

consulte “¿Cómo recortar los espacios en blanco de una variable Bash?”

avatar de usuario
stefco

Las soluciones aceptadas anteriormente no funcionan para mí cuando veo un específico archivo/compromiso (el -U opción parece interferir con el análisis de rev/ruta), pero --inter-hunk-context= funciona en este caso en git version 2.24.0:

git diff \
    --no-prefix \
    --inter-hunk-context=2000 \
    master -- \
        path/to/file.py

Si no sabe el tamaño del archivo, por supuesto puede encontrarlo con wc -l en lugar de codificarlo:

git diff \
    --no-prefix \
    --inter-hunk-context=$(wc -l path/to/file.py) \
    master -- \
        path/to/file.py

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad