2011-06-28 14 views
5

¿Cuál es la mejor manera de manejar los cambios de nombre de clase (por ejemplo, hecho con Resharper) con Git?Detección de cambio de nombre de Git cuando la clase y el nombre de archivo han cambiado en una confirmación

Es decir, si el nombre de la clase y el nombre del archivo que lo contiene se cambian juntos y se confirman sin más cambios.

Parece que la forma en que Git maneja los cambios de nombre a través de un porcentaje de cambio de heurística es un poco al azar. Para clases grandes, se reconocerá como un cambio de nombre, pero para las clases pequeñas, se alcanza el umbral de porcentaje, de modo que se verá como un eliminar y agregar.

+1

Git no realiza un seguimiento de los cambios de nombre explícitamente. Se infiere sobre la marcha, por lo que no hay forma de que Git trate algo así como un cambio de nombre si no puede detectarlo. – hammar

Respuesta

6

Tenga en cuenta que en la historia de Git, los cambios de nombre de archivo son no almacenados como "esto se renombró de X a Y". En cambio, el archivo X existe en una revisión, y en la siguiente revisión Y existe (y X no). Por ejemplo:

 
Revision | Files 
---------+---------------------------------- 
HEAD^ | a.cpp x.cpp    z.cpp 
HEAD  | a.cpp    y.cpp z.cpp 

En el diagrama anterior, cada revisión es una fila y cada una contiene tres archivos. Entre las dos revisiones, x.cpp se renombró a y.cpp. La única información que almacena el repositorio es el contenido de cada revisión por separado.

Cuando Git (u otra herramienta que lea los repositorios de Git) mira el historial anterior, nota que y.cpp es un archivo nuevo en HEAD. Luego mira la revisión anterior para ver si existía un archivo similar. En el caso de un cambio de nombre de archivo directo, entonces sí, un archivo llamado x.cpp con los mismos contenidos existía en la revisión anterior (y ya no existe en la revisión actual). Entonces, el nuevo archivo se muestra como un cambio de nombre de x.cpp a y.cpp.

En el caso de un cambio de nombre y modificación, Git mirará los archivos de la revisión anterior para ver si un archivo se ve cerca del nuevo archivo (en términos de su contenido). Aquí es donde entra la heurística. Si la mayoría de las líneas son iguales, entonces Git lo mostrará como un cambio de nombre, pero si hay suficientes líneas cambiadas en comparación con las líneas sin cambios, entonces Git simplemente dirá que se ve como un archivo nuevo.

Para responder a su pregunta, la mejor manera de manejar los cambios de clase de la clase resharper es simplemente hacerlo y confirmar los nuevos archivos. Git almacena los archivos antiguos y nuevos en su repositorio. La detección de cambio de nombre se maneja más tarde, en el momento en que realmente preguntas sobre el historial. Es por eso que comandos como git log tienen opciones como --find-copies y --find-copies-harder.

+0

Entonces, ¿está diciendo "un comentario justo antes del cambio de nombre, se vuelven a comprometer justo después del cambio de nombre" –

+1

@ Ian Ringrose: No realmente, no. Si haces eso, tendrías un commit en el medio donde el estado del proyecto no se puede construir correctamente (porque las cosas pueden estar en un estado medio renombrado). Realice el cambio, incluido el cambio de nombre si es necesario, y el código de trabajo de compromiso. –

Cuestiones relacionadas