¿Cómo obtener git diff con contexto completo?

114

¿Cómo crear un parche adecuado para revisar en crisol?

git diff branch master --no-prefix > patch

Esto genera solo 3 líneas de contexto. Entonces hago lo siguiente

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

Es de esperar que todos los archivos tengan menos de 2000 líneas. ¿Hay alguna manera de decirle a git que incluya todas las líneas en el archivo para el parche sin tener que especificar el máximo de líneas?

balki
fuente
3
Publiqué la opción -U <infinity> para mostrar el archivo completo, como una pregunta separada stackoverflow.com/questions/28727424/…
Aleksandr Levchuk

Respuestas:

54

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 recuento de líneas promete que funcionará incluso para un pequeño cambio en un archivo muy grande.

Esdras
fuente
1
<no es necesario. git diff -U$(wc -l MYFILE) MYFILE
Balki
2
Gracias @balki, probé tu sugerencia y noté que <pre> $ (wc -l MYFILE) </pre> se expande al recuento de líneas seguido del nombre del archivo, por lo que el segundo uso del nombre del archivo también se puede omitir. Estoy actualizando mi respuesta para reflejar esto.
Esdras
4
Es una diferencia, hay dos versiones del archivo. ¿Qué pasa si la versión que no está en el disco es el doble de larga? ¿No es -U con un número realmente grande más seguro?
Eloff
@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 del archivo actual en el disco.
Esdras
3
git diff -U$(wc -l MYFILE | awk '{print $1}') MYFILEes una mejor respuesta que analiza correctamente la salida de wcobteniendo solo la cantidad de líneas sin espacios en blanco, sin depender de la salida sin comillas de una subcapa para crear dos argumentos, y funciona en macOS / BSD.
anishpatel
94

Esto parece funcionar bastante bien:

git diff --no-prefix -U1000

Con la advertencia:

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

c24w
fuente
16
La -Uopción que sugiere es la misma que la que --unified=utiliza el autor de la pregunta. La única diferencia es que especificas 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 al infinito, pero sugieres cortar el número a la mitad. ¿Por qué?
LS
4
@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 persona extraña que aterriza aquí.
c24w
Gracias por esto, ¡también funciona muy bien con git show!
Shakeel
@ c24w De acuerdo, todavía me da lo que quiero ver en la pantalla.
Chef Pharaoh
1
La --no-prefixopción elimina los prefijos de destino “/ a /” y “/ b /” que aparecen de forma predeterminada. (página vinculada)
luckydonald
10

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

Se diff.contextpuede usar una nueva variable de configuración " " para dar el número predeterminado de líneas de contexto en la salida del parche, para anular el valor predeterminado codificado de 3 líneas.

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

VonC
fuente
7
Sin embargo, eso no tiene una opción para decir 'Todas las líneas en el archivo'
balki
3
Sospecho que poner un número grande simularía "todas las líneas"
VonC
7
"Sospecho que poner un número grande simularía" todas las líneas "" ... excepto cuando no lo hace y luego se rompen las cosas. Todo es sinónimo de infinito, y un número muy grande es solo eso: un número, no infinito.
Trenton
4

Obtuve inspiración 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 "git df" a veces no funciona, debido al cambio de directorio al ejecutar git alias. (Vea que los alias de git operan en el directorio incorrecto ). Entonces 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 $@; do
    git diff -U$(wc -l "${FILE}" | cut -d ' ' -f 1) "${FILE}"
done
exit 0
Yun Wu
fuente
0

Las soluciones aceptadas anteriormente no funcionan para mí cuando veo un archivo / confirmación específico (la -Uopció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 conoce el tamaño del archivo, por supuesto, puede buscarlo en wc -llugar de codificarlo:

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