2012-05-07 10 views
10

Configuré *.py diff=python en .git/info/attributes. Entonces, Git sabe dónde están los límites de las funciones. git diff -W incluso puede asegurar que se muestre toda la función.Limitar Git ¿Difiere en una o más funciones?

Pero, ¿hay alguna manera de limitar la salida de un git diff a solo una función en particular (o más de una)?

(De no ser así, supongo que es awk ...)

EDITAR Esto también sería útil para git log y git rev-list: no me demuestra cada commit que modifica views.py, me compromete mostrar que modifican una cierta función en él. (Sí, en un mundo ideal, views.py no sería una línea gigante de 2000 modificada con frecuencia por 8 desarrolladores diferentes ...)

+1

Puede encontrar esto vale la pena leer: http://stackoverflow.com/questions/523307/semantic-diff-utilities – JosefAssad

+0

Si Es interesante, pero parece un campo bastante inmaduro. –

Respuesta

2

Ok, gracias a Birei, tenemos una solución.

utilizar el script awk en esa respuesta, combinado con un poco de bash:

~/scripts/grit:

#!/bin/bash 
cmd=$1 
shift 1 
if [ "$cmd" = "" ]; then 
    git 
# other commands not relevant to this question go here 
elif [ $cmd = "funcdiff" ]; then 
    git show "$1:$3" | awk -f ~/scripts/getfunc.awk -v f=$4 > /tmp/.tmp1 
    git show "$2:$3" | awk -f ~/scripts/getfunc.awk -v f=$4 > /tmp/.tmp2 
    git diff -W --no-index /tmp/.tmp1 /tmp/.tmp2 

else 
    git $cmd [email protected] 
fi 

Ejemplo de uso: grit funcdiff 009e75 8b7a14 ./staging.py write_uploaded

Esto también podría añadirse como un alias git en ~ /.gitconfig

1

No encontré ninguna otra opción (que no sea el --function-context o su -W corto) opción, ya mencionado) capaz de restringir una salida de diff a una sola función.

E incluso que -W opción no siempre es suficiente, sabiendo que una 'función' puede variar mucho de un idioma a otro, como se ilustra en este blog post:

que he encontrado esta opción en lugar poco fiable, al menos dentro de una gran clase de PHP.
Mis pruebas encontradas --function-context a menudo resultan en mostrar casi todo el archivo original, y git parece ignorar los límites de función de PHP.
El número de líneas de contexto antes y después de un cambio parece aleatorio, y el diff no siempre muestra necesariamente todas las líneas de la función.

El original patch message que introdujo este cambio arroja algo de luz:

Esta aplicación tiene el mismo inconveniente que el de grep, a saber, que no hay manera de encontrar explícitamente el final de una función.
Eso significa que se muestran algunas líneas de contexto adicional, hasta la próxima función reconocida comienza.

Parece que la detección de los límites de una función es difícil para git.
Parece que en este caso, git nunca detecta un límite de función y nos da el contexto de todo el archivo.


Como los OP Steve Bennett puntos a cabo, una posible solución sería la de definir un alias Git que extraería la función en la revisión antes y después de la modificación, con el fin de diff en esos 2 ficheros 'temp.
Ejemplo en "Creating Git Aliases" y "Bash script to select a single Python function from a file".

Esta es una solución ad-hoc que podrá analizar el tipo específico de fuente con la que trabaja el OP en su repositorio.

+0

Sí, ahora estoy probando otra táctica, usando git alias con una secuencia de comandos para analizar el archivo: http://stackoverflow.com/questions/10512351/bash-script-to-select-a-single-python-function- from-a-file Me inspiré en esta publicación, que encontré completamente al azar: http://davidwalsh.name/git-aliases –

+0

@SteveBennett Interesante enfoque. Lo he incluido en la respuesta para tener más visibilidad y para contrastar esta solución ad-hoc con la falta de una característica más "genérica". – VonC

Cuestiones relacionadas