¿Cómo puedo get diffs basados ​​en funciones c?

Nuestro equipo usa svn para administrar nuestra fuente. Cuando realizo un re-factor en un file C, de vez en cuando ambos cambio las funciones y las muevo dentro del file. En general, trato de evitar las funciones de movimiento, ya que hace que el svn diff pnetworkingeterminado se desconcierte un poco sobre lo que está sucediendo, y a menudo proporciona un diff que es más confuso de lo necesario.

No obstante, de vez en cuando hago cambios en la location del file de function y cambio de código interno de la function. Otro lugar en el que esto aparece es en la fusión de sucursales, cuando el file está en conflicto y una o ambas twigs tienen movimientos y cambios dentro de la function.

Entonces, lo que estoy buscando es una herramienta de diferencia semánticamente consciente que me diga diferencias en dos niveles: la configuration de la function y el detalle (intrafunction). Traté de usar la opción "-p" para diff (-x -p a svn diff), pero eso no es lo que estaba destinado, ciertamente no hizo lo que yo quería.

Otra opción en la que solo pensé es usar un progtwig de diferencias diseñado para capturar códigos, como una universidad podría usar para verificar asignaciones, pero nada obvio surgió en una búsqueda rápida.

Una forma de hacerlo con las herramientas que tiene es mover primero las funciones, registrarlas y luego cambiarlas. O tenga dos alistmientos, y cuando vea que esto sucede, muévalos en uno, svn up en el otro, resuelva el problema de fusión. Mueve el trabajo hacia ti, pero hace que las revisiones de códigos sean más fáciles.

ya que aumentó un poco el nivel de dificultad del problema con su última edición:

hay límites de lo que svn puede hacer, esa es la razón por la cual git fue escrito. la respuesta a su problema es básicamente "no, no hay herramientas que puedan rastrear el código en un nivel semántico con svn"

(en realidad, no hay herramientas de seguimiento semántico disponibles para git, rastrea el contenido)

Realizo cambios estéticos (moviendo funciones) y cambios funcionales en diferentes compromisos, y coloco "cosméticos" en el post de confirmación. De esta forma, se ignora el enorme y poco interesante diff para el trabajo de cosméticos, y usted tiene una diferencia concisa para los cambios funcionales.

podrías intentar hacer esa refactorización con git :

Y al usar git, todo el 'mantener el movimiento del código separado de los cambios' tiene una razón aún más fundamental: git puede seguir el movimiento del código (de nuevo, ya sea moviendo un file completo o solo una function entre files) y haciendo 'git culpa' C 'seguirá el movimiento del código entre files. Hace eso por análisis de similitud, pero significa que si mueves el código y lo cambias al mismo time, git no puede ver que 'oh, esa function provino originalmente de ese otro file', y ahora obtienes peores annotations sobre donde el código realmente se originó

entonces, la idea sería inicializar un repository de git y volver a reproducir todos los enlaces de svn pertinentes a ese repository. después de eso, use git para averiguar qué contenido se movió a dónde.