2012-10-04 25 views
6

He realizado varios refactores en eclipse donde muevo un gran conjunto de archivos a otro paquete java. A menudo, esto provoca que muchos archivos se actualicen automáticamente para resolver las referencias. Entonces, los compromisos en estos casos tienden a ser bastante grandes.¿Por qué mi historial de archivos git se pierde después de realizar un refactorio de movimiento en eclipse?

Supuse que git rastreaba los cambios de nombre y podía usar git log --follow para seguir el historial a través del cambio de nombre, pero git no siguió los cambios de nombre.

Realicé operaciones de refactorización más pequeñas en Eclipse, donde los cambios de nombre son detectados en la confirmación. La única diferencia parece ser el tamaño de las confirmaciones.

¿Alguna idea?

+0

Para agregar a esto, parece que el plugin EGit eclipse no tiene forma de especificar los valores -M o -l para el registro de git (como lo menciona cdhowie). Por lo tanto, tendrá que presionar CLI si desea usar esos indicadores. – Jonathan

+2

EGit (bueno, JGit para ser exacto) respeta la configuración 'diff.renameLimit'. El valor predeterminado es 200, pero puede configurarlo a un valor más alto en su configuración de git global o por repositorio. – robinst

Respuesta

7

Git no realiza el seguimiento de los cambios en el historial, pero git log puede detectar heurísticamente los cambios en función del contenido de la confirmación.

  • Es posible que tenga que especificar la mínima -Mgit log por ciento a fin de que se detecten los cambios de nombre. Si más de un porcentaje del archivo ha cambiado, git log (y git diff) no considerarán que un par agregar/eliminar sea un cambio de nombre. Si los archivos movidos eran muy pequeños y requerían cambios de contenido (por ejemplo, a los nombres de los paquetes), podrían exceder este umbral.
  • También puede necesitar especificar un valor para -l, que especifica la cantidad máxima de posibles cambios de nombre para evaluar. En confirmaciones grandes, es posible que esté excediendo esto, por lo que Git no evalúa los cambios de nombre para evitar que la operación de registro tarde demasiado. (La detección de renombrados es una operación O (n^2), donde n es el número de pares de agregar/eliminar que deben considerarse, por lo que el tiempo necesario para procesar cada confirmación en una operación de registro que busca cambiar de nombre aumenta exponencialmente con el número de añadir/eliminar permutaciones.)

Consulte la página de manual de git-log para obtener descripciones más detalladas de estas opciones.

Cuestiones relacionadas