Cómo reestructurar un repository mercurial con dos twigs principales paralelas

La historia de mi repository se ve así:

A -- B -- C (branch "foo") \ -- D (branch "bar") 

Las dos twigs son twigs de "envío", y son esencialmente diferentes interfaces para un back-end común.

Todo el código solía estar en una twig, con las funciones foo o bar activadas o desactivadas por un conmutador de compilation, pero me bifurqué para facilitar el trabajo con cada una de ellas individualmente.

El problema es que los files "back-end" comunes, por sí mismos, probablemente deberían ser una twig separada, y a menudo quiero simplemente trabajar en esos files comunes. Debido a la forma en que creé estas twigs, la historia está un poco estropeada: en el pasado de la bar ramificaciones, solía tener características de foo .

Actualmente, simplemente hago cambios en una twig y luego uso el hg transplant para copyr los mismos cambios en la otra twig.

En cambio, me gustaría poder hacer cambios de esta manera:

  __ C __ D' (branch "foo") / / A -- B -- D (branch "backend") \ \ -- E -- D'' (branch "bar") 

Es decir, trabajar en el backend la sucursal, y luego en cada una de las twigs de envío ( foo y bar ), utilizo hg merge backend .

¿Cuál es la mejor manera de pasar de mi situación actual a la que estoy describiendo? La única forma en que puedo pensar es:

  1. Elimine todas las funciones de foo y bar , y backend nombre de backend sucursal.

  2. Elimina las antiguas twigs foo y bar .

  3. Agregue manualmente las funciones de foo para backendbackend y backend nombre de esa twig, y ​​también para la bar .

¿Hay una mejor manera?

Además, ¿es esto lo correcto?

¿Cuántos sets de cambios hay en las twigs foo y bar ? ¿Están los sets de cambios de back-end (trasplantados) separados de los sets de cambios frontend?

Si los sets de cambios no son muchos y están limpios, es posible que desee hacer esto:

  C -- 1 -- 2 -- D -- 3 (branch "foo") / A -- B ----------- C" -- D" (branch "backend") \ C' -- 4 ------ D' --- 5 (branch "bar") 

(Aquí A, B, C, D están relacionados con el backend; 1, 2, 3 están relacionados con foo; 4, 5 están relacionados con el bar).

– es decir, crea tu backend brach basado en el ancestro común más reciente de foo y bar , luego transplanta todos los sets de cambios relacionados con el backend. A partir de este punto, podrás unir backend en cualquiera de las twigs.

Elegí dividirlo en varios repositorys en lugar de varias twigs en un repository, de la siguiente manera:

  1. Cerré la bar la bar .

  2. Cloné el repository original en un nuevo backend repository.

  3. Eliminé todo el código relacionado con foo .

  4. Hice esos cambios en el repository principal, y luego los retiré inmediatamente (para que el código foo permanezca). Esto se convirtió en mi repository foo .

  5. Cloné el repository backend en una nueva bar repository.

  6. Copié y pegué todos los files de la twig de la bar ahora cerrada en el repository de la bar .

Esto mantuvo mi historia para foo , y perdí la continuidad de la historia para el bar (aunque toda la historia todavía está allí, si lo necesitaba); y ahora tanto foo como bar son clones, con modificaciones, del repository backend , que es exactamente lo que yo quería.