Recuperando el historial en hg cuando el movimiento no se realiza correctamente

Entonces, alguien de nuestro equipo movió una carpeta completa a un subdirectory sin usar la function de cambio de nombre de hg. La estructura del directory es como la necesitamos, pero el historial ya no existe antes de la mudanza. Lo muestra como un nuevo file cuando se produjo el movimiento. Numerosas grandes fusiones han sucedido desde entonces, por lo que no es realmente práctico retroceder en el time y hacerlo bien.

He intentado hg log --follow y no ayuda, ya que hg no sabe sobre el cambio de nombre. ¿Hay alguna forma de vincular manualmente los files a las antiguas versiones eliminadas después del hecho, o hay alguna facilidad, como la forma en que git puede inferir movimientos y renombrar en function de la huerística? Sería bueno si hubiera alguna manera de decir explícitamente, "este file es una continuación de este viejo file borrado", aunque eso aún tomaría algún time para arreglarlo todo bien.

Todos hemos renunciado a recuperar esa historia, pero sería muy bueno tenerla.

Debe volver a hacer el movimiento correctamente al decirle explícitamente a Mercurial qué files se movieron, luego combinar los sets de cambios rotos. De esta manera, restaurará la ruta del historial a los files originales.

Pasos, suponiendo que <x> es la revisión de movimiento, y <y> es la revisión actual de la cabeza.

  1. Actualice la revisión antes de la mudanza: hg update <x-1>
  2. Rehaga el movimiento, pero ahora use correctamente hg rename o hg rename --after
  3. Cometer
  4. Fusionar con la revisión de movimiento original ( hg merge <x> ), esto no debería tener conflictos, pero si se descartan todos los cambios.
  5. Cometer
  6. Fusionar con los sets de cambios restantes después del movimiento (si corresponde) ( hg merge <y> )
  7. Cometer

Aquí está el process básico que se muestra en la línea de command:

 $ mkdir move-merge-test $ cd move-merge-test $ hg init $ echo "x" > a $ hg add a $ hg commit -m "initial revision" 

Moverse incorrectamente:

 $ mv ab $ hg remove a $ hg add b $ hg status --copies A b R a $ hg commit -m "incorrect move" $ hg log --follow b changeset: 1:b22f3e94133b tag: tip user: Laurens Holst <...> date: Wed Oct 19 14:41:37 2011 +0200 summary: incorrect move 

Corrija el movimiento:

 $ hg update 0 1 files updated, 0 files merged, 1 files removed, 0 files unresolved $ hg rename ab $ hg status --copies A b a R a $ hg commit -m "correct move" created new head $ hg log --follow b changeset: 2:5deabbcb5480 tag: tip parent: 0:b82f89f0c7d9 user: Laurens Holst <...> date: Wed Oct 19 14:46:35 2011 +0200 summary: correct move changeset: 0:b82f89f0c7d9 user: Laurens Holst <...> date: Wed Oct 19 14:36:35 2011 +0200 summary: initial revision 

Combínalo con el movimiento roto:

 $ hg merge 1 1 files updated, 0 files merged, 0 files removed, 0 files unresolved (branch merge, don't forget to commit) $ hg commit -m "merge with broken move" $ hg log --follow b changeset: 3:ce65fc7b35e4 tag: tip parent: 2:5deabbcb5480 parent: 1:b22f3e94133b user: Laurens Holst <...> date: Wed Oct 19 14:47:13 2011 +0200 summary: merge broken branch changeset: 2:5deabbcb5480 parent: 0:b82f89f0c7d9 user: Laurens Holst <...> date: Wed Oct 19 14:46:35 2011 +0200 summary: correct move changeset: 1:b22f3e94133b user: Laurens Holst <...> date: Wed Oct 19 14:41:37 2011 +0200 summary: incorrect move changeset: 0:b82f89f0c7d9 user: Laurens Holst <...> date: Wed Oct 19 14:36:35 2011 +0200 summary: initial revision 

Como puede ver, el historial ahora muestra correctamente todos los sets de cambios afectados. Si los files se mueven en varias confirmaciones, el principio básico sigue siendo el mismo, simplemente fusiona más de 1 compromiso. Si tiene confirmaciones hechas después de la mudanza, le recomiendo fusionarlas por separado (paso 6 en los pasos anteriores) para evitar conflictos espurios.

Tuve buena suerte con este tipo de cosas al eliminar el nuevo file (el "movido"), luego volver a una revisión cuando el file aún estaba en su lugar, realizar el movimiento correctamente (incluida la confirmación) y unir las dos cabezas.

Hay una opción --after a hg rename que le permite decirle a Mercurial sobre un cambio de nombre después del hecho, pero debe hacerse antes de confirmar el cambio de nombre.

Podría intentar hacer la hg convert en el repository y especificar el parámetro --filemap , que le permitirá cambiar el nombre de los files y directorys.

https://www.mercurial-scm.org/wiki/ConvertExtension#A–filemap