2010-11-10 18 views
17

Estoy usando regularmente el parche y la diferencia de gnu-utils. El uso de git, hago a menudo:¿Hay una herramienta de diff (parche) que tenga en cuenta la sangría?

git diff 

cambia a menudo simples crean un gran parche porque el único que cambió fue, por ejemplo, la adición de un if/else bucle y dentro de todo es una sangría a la derecha.

La revisión de dicho parche puede ser engorrosa porque solo la comparación manual línea a línea puede indicar si algo ha cambiado esencialmente dentro del código sangrado. Podemos estar hablando solo de unas pocas líneas de código, o de docenas (o mucho más) de código anidado. (Lo sé: una función tan hipotéticamente grande sería mejor dividirla en funciones más pequeñas, pero eso no viene al caso).

No se puede GNU diff/patch tener en cuenta cuando el único cambio dentro de un bloque de código es la sangría y que el desarrollador sepa tanto?

¿Hay otras herramientas de diferenciación que funcionen de esta manera?

Editar: Ok, hay --ignore-space-change pero entonces estamos en una cualquiera/o situación: o bien tenemos un parche humana, más legible o tenemos un parche completo que la máquina sabría cómo leer. ¿No podemos tener lo mejor de ambos mundos con una herramienta de diff más elaborada que mostraría los cambios en el espacio humano por lo que son, mientras que permite a la máquina aplicar el parche por completo?

Respuesta

17

Con GNU diff puede pasar -b o --ignore-space-change para ignorar los cambios en la cantidad de espacio en blanco en un parche.

Si usa emacs y se le ha enviado un parche, también puede usar M-x diff-ignore-whitespace-hunk para reformatear el parche para ignorar el espacio en blanco en un trozo en particular. O diff-refine-hunk para resaltar los cambios en un personaje por nivel de personaje, lo que tiende a señalar la "carne" de un cambio.

En cuanto a la aplicación de parches, puede usar -l o --ignore-whitespace con parche GNU para ignorar las pestañas y los cambios de espacios. Sólo tenga cuidado con el código Python :-)

+2

+1 Es bueno saberlo. git diff -b> my.patch también funciona. Eso es útil. no funcionaría como un parche apropiado o de lo contrario no se aplicaría la sangría prevista. Me preguntaba si podríamos obtener lo mejor de ambos lados del problema, por ejemplo, tener un archivo de parche con 3 tipos de líneas (coloreado en consecuencia): líneas que no han cambiado, líneas que han cambiado (- o +) y las líneas que simplemente han sido sangradas ... Tanto la máquina sabría cómo aplicar el parche como el humano lo entendería mejor. – augustin

2

No sé git diff. Pero una herramienta de tipo diff que comprende no solo la sangría, sino que de hecho cualquier cambio de diseño en su idioma de destino es nuestro Smart Differencer.

Esta herramienta analiza las versiones anteriores y posteriores de su código del mismo modo que el compilador, y compara los árboles de sintaxis resultantes, para que no se vea afectado por los cambios de espacio en blanco (excepto espacios semánticamente importantes como la indentación de Python) cualquier tipo, comentarios insertados o eliminados, o incluso cambio de radix en constantes.

El resultado es un informe en términos de acciones de edición del programador ("mover, insertar, borrar, copiar, renombrar") sobre estructuras de lenguaje (expresiones, declaraciones, declaraciones, bloques, métodos, ...) en lugar de "insertar línea "o" eliminar línea ".

2

Por qué vale la pena, usando git difftool con una herramienta como meld o xxdiff hace que el diff mucho más legible.

0

Intento no hacer cambios de sangría en todo el archivo en la misma confirmación como en otros cambios. Y confirmo los cambios de sangría en una confirmación por separado antes o después, con un mensaje de confirmación de "Solo sangría modificada".", para que quede claro, para que no se necesite ninguna inspección manual de diferencias, para ver si se cambió algo más.

Cuestiones relacionadas