¿Existe un sistema de control de versiones que pueda mostrar cambios en un método o función específicos? [cerrado]

11

A veces sería bueno poder decir algo como:

(git|svn|hg|etc) diff Foo.c:main
(git|svn|hg|etc) log log Foo.c:main

para ver los cambios realizados en una función específica dentro de un archivo fuente desde la última confirmación o el historial completo de cambios. Mi pregunta es doble:

  1. ¿Existe algo que haga esto?
  2. ¿Sería una herramienta práctica? Tendría que hacer un análisis simple del código en cada revisión para comparar diferentes versiones de la función; ¿la sobrecarga sería demasiado para que sea eficiente?
jches
fuente
77
La necesidad de esto parece ser un síntoma de un problema subyacente, como que los métodos son demasiado grandes o las clases no están organizadas correctamente, ya que cualquier VCS que valga la pena le dará una diferencia de la clase, y es bastante fácil desplazarse hacia abajo para (o buscar) el método en cuestión si la clase no es demasiado grande y puede ver el código en el método dentro del contexto de toda la clase. En resumen, creo que la resolución del método es demasiado específica.
Robert Harvey
@Robert, ese es un buen punto, y creo que mi motivación para preguntarme se debe en parte a al menos un poco de código. Rastreé un error en un método específico y quiero poder ver un registro de cambios solo en ese método para ver dónde se rompió, y las diferencias completas pueden ser un poco inconvenientes para buscar si tienes prisa :)
jches
44
Para el caso muy raro cuando esto es útil, la función de Culpa de TortoiseXXX es bastante poderosa. Puede ver cuándo se realizaron los últimos cambios en todas las líneas del método y, utilizando el margen derecho, siga retrocediendo a través de esos cambios.
pdr

Respuestas:

14
  1. Que yo sepa, no lo hace. Uno podría, pero no esperaría que fuera la calidad de producción si lo hiciera.
  2. No creo que sea práctico, pero no por la razón que mencionó. No es práctico porque el VCS tendría que tener en cuenta el lenguaje para admitir ese tipo de funcionalidad. Esencialmente, necesitaría insertar algo para analizar el texto del idioma (uno de los grandes pasos que hace un compilador). Esto agrega mucho peso extra a su VCS, que ya está haciendo un trabajo bastante complejo.
    Pero, lo que es más importante, deberá hacer lo mismo para cada idioma que desee admitir. Un VCS cuyo punto de venta solo funciona en el código C no va a tener mucha tracción. Incluso si ignora todos los idiomas oscuros, sería una tarea masiva admitir incluso los 10 idiomas principales.

Y como Robert señaló, ser capaz de saltar inmediatamente a un método no es una gran ganancia sobre tener que saltar manualmente al método dentro de la herramienta diff.

muestreador
fuente
44
Secundo el punto de dependencia del idioma y tengo mucho código redundante
Chander Shivdasani
1
Sin embargo, se podría hacer el mismo argumento contra los editores de resaltado de código; deben ser conscientes del idioma y de hecho existen. Tal vez la recompensa sea un poco más alta (¡pantallas coloridas de codez!). Estoy de acuerdo en que analizar probablemente sea la parte más difícil. Sin embargo, no sería tan difícil admitir los idiomas más comunes, especialmente porque no es necesario analizar completamente el programa.
jches
8

svn en realidad hace algo parecido a lo que quieres.

Puedes usar el comando:

svn diff -x -p program.c 

El -x -p proporciona nombre de función 'C' en la parte superior del conjunto de cambio. que se parece a esto

@@ -97,6 +102,8 @@ int function1(int *x)

No se filtra pero puede grep / search para cumplir con su propósito de cerca.

Supongo que esto es solo para 'C' (o C / C ++). Sin embargo, supongo que si hay una demanda, svn también lo haría disponible para otros idiomas.

No me suscribo al argumento de que VCS NO debería hacer eso. Después de todo, queremos que todos los IDE o editores (como VIM, EMACS) realicen el resaltado de sintaxis que es específico de cada idioma y admite muchos simultáneamente. Por lo tanto, VCS, como herramienta de desarrollo, también debería admitir dicha funcionalidad.

Por supuesto, gracias a tu pregunta que lo descubrí. Nunca lo había usado antes.

Dipan Mehta
fuente
1

Sin entrar en detalles, ... pero puede visitar el sitio de Semantic Designs y su gama de productos. Ofrecen algunas herramientas que son sensibles al lenguaje , por decirlo así, a falta de un término mejor.

Torre
fuente
-1

Para mostrar qué revisión y autor modificaron por última vez cada línea de un archivo:

git blame filename
Ghita
fuente
1
Es cierto, pero la Q pide una forma de buscar cambios en un método particular dentro de un archivo. Imagine que hay 100 revisiones en un archivo determinado, y de las que necesita encontrar las que incluyen cambios en una función en particular.
Caleb
El control de versiones no conoce los detalles de sintaxis, y tampoco le importan los tipos de archivos.
Ghita
-1

ENVY y STORE hacen eso. Es interesante que, como con Monicello que Logan Capaldo mencionó anteriormente, estos también son para Smalltalk.

stevek_mcc
fuente