¿Se puede integrar Refactor > Move de Eclipse con Git?

3 minutos de lectura

Una de las mejores cosas de usar un IDE para Java son las refactorizaciones automáticas que obtiene. El problema que tengo es que después de usar Refactorizar > Mover para mover una clase a un paquete diferente (que mueve el propio archivo en el sistema de archivos), git status muestra que el archivo en la ubicación anterior se eliminó y se agregó el de la nueva ubicación.

La solución que he encontrado es torpe:

mv src/com/example/newpackage/Foo.java src/com/example/oldpackage/Foo.java
git mv src/com/example/oldpackage/Foo.java src/com/example/newpackage/Foo.java

¿Hay alguna forma (al usar el complemento de Git para Eclipse) para que la refactorización haga un git mv en lugar de un movimiento ingenuo del sistema de archivos?

  • ¿Cuál es el estado real que obtiene después de mudarse? ¿Se organizan ambos cambios (la adición y la eliminación)? Si es así, intente un git diff --cached -M. Descubrí que ocasionalmente tienes que decirle a git que detecte un cambio de nombre, en particular porque se detecta después.

    – determinista

    26 de julio de 2011 a las 14:02


  • git me muestra que el archivo anterior se eliminó y el nuevo no está rastreado (por lo tanto, no está preparado). Probé el git diff --cached -My ver la nueva ubicación como un nuevo archivo. ¿Qué debería estar buscando?

    –Josh Glover

    28 de julio de 2011 a las 9:48


  • Es por eso que no estás viendo el cambio entonces. Git no va a hacer nada con un archivo nuevo hasta que esté en el índice (se mueve allí por preparación). Si prepara el archivo nuevo, ambos git status y git diff --cached -M informará el cambio como un cambio de nombre. Si hay demasiados cambios en la diferencia, agregue --name-status y solo mostrará el índice de similitud (en la forma RXX, donde XX es el porcentaje de similitud).

    – determinista

    28 de julio de 2011 a las 12:56

  • En realidad, la puesta en escena de ambos archivos aún no informa un cambio de nombre; informa una eliminación y un nuevo archivo.

    –Josh Glover

    28 de julio de 2011 a las 14:09

  • Desde stackoverflow.com/questions/2641146/… parece que es posible que git no realice la detección de cambio de nombre (que puede ser una operación costosa) para el estado de git de forma predeterminada. Prueba el git commit --dryrun Comando que recomiendan allí. Hizo el git diff cached -M reportar el cambio de nombre? Si es así, ¿fue alto el índice de similitud? Hice mis pruebas con solo mover un archivo y una cantidad muy pequeña de cambios, la refactorización puede haber tenido muchos más cambios que pueden haberlo reducido demasiado.

    – determinista

    28 de julio de 2011 a las 21:29

Esa es la forma en que Git funciona con cambios de nombre/movimientos (eliminar archivo antiguo y agregar archivo nuevo). Luego detecta el contenido del archivo y reconoce un cambio de nombre basado en un algoritmo. Entonces, incluso muestra que elimina y agrega, si confirma y luego hace un “git log –follow movedfilename”, debería mostrarle todo el historial, incluso el historial antes del cambio de nombre.

  • OK, git log --name-only me muestra que solo se cambió el nuevo archivo, así que supongo que estoy lo suficientemente feliz. solo me estaba enganchando git status no me muestra “renombrado”, pero parece que no importa un ápice al examinar las confirmaciones. ¡Idiota listo! Gracias por la educación, dunni. 🙂

    –Josh Glover

    28 de julio de 2011 a las 10:02

  • Importante notar que esto no funciona si mientras “mueves” el archivo también modificas su contenido. En ese caso, git solo verá esto como eliminar/agregar. Debe asegurarse de organizar/confirmar sus cambios de movimiento (o cambios de contenido) en dos pasos independientes.

    –Roberto Andrade

    7 oct 2013 a las 21:18

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad