Ramas Mercurial con diferente base de código

Estoy luchando por encontrar un buen método para manejar mi flujo de trabajo con Mercurial. He leído muchas preguntas relacionadas aquí en SO y otros lugares pero no pude encontrar una solución razonable.

Supongamos que tengo dos twigs:

  1. la twig pnetworkingeterminada en la que realizo el desarrollo normal. Implementación de lanzamientos desde y marcado con tags de lanzamiento
  2. una sucursal para un cliente específico que se mantiene por separado. Se ejecuta en un número de versión diferente, derivado de una versión anterior de la aplicación.

Estas dos twigs son en su mayoría idénticas ahora, pero ya hay algunas diferencias. Con el time, se alejarán más.

Significa que tengo 4 types de files fuente:

  1. Tipo A : files que permanecen idénticos en ambas twigs (los cambios, si se introducen, deben estar presentes en ambos). Estos son la mayoría de los files.
  2. Tipo B : files que están solo en la twig pnetworkingeterminada y no necesitan fusionarse en la twig del cliente
  3. Tipo C : files que están solo en la twig del cliente y no necesitan fusionarse en la twig pnetworkingeterminada
  4. Tipo-D : los files que están presentes en ambas twigs, tienen código compartido pero también contienen código que debe permanecer separado y específico para cada twig

Desarrollo hecho en la twig pnetworkingeterminada y hay lanzamientos regulares que son principalmente incrementales. Pero también tengo estos dos escenarios:

  1. Algunos cambios realizados en la sucursal pnetworkingeterminada también deben fusionarse con la sucursal del cliente (por ejemplo, un error o una característica que debe corregirse / agregarse a ambos).
  2. Una "revisión" realizada en la sucursal del cliente y no puede combinarse inmediatamente con la sucursal pnetworkingeterminada, pero necesita fusionarse eventualmente en algún momento.

El problema es que no puedo encontrar una manera razonablemente simple, limpia y segura de sustentar estos dos escenarios. Mercurial no tiene el concepto de fusiones parciales o ignorar files en la fusión. Combina sets de cambios pero insiste en include los files que se introdujeron en las revisiones anteriores.

La combinación pnetworkingeterminada en la sucursal o cliente del cliente en los escenarios pnetworkingeterminados me obliga a agregar files de Tipo B y Tipo C. Hacer un cambio al file de Tipo-A que no necesita ser agregado a la otra twig (convirtiéndolo en Tipo-D) presenta un desafío.

Ahora, obviamente, puedo solucionar algunos de estos problemas utilizando las definiciones del comstackdor (manteniendo así los files fuente en ambas twigs), editando código manualmente y eliminando files manualmente después de las fusiones, pero esto no parece ser la forma más eficiente y limpia de manejar esta.

Seguramente este es un flujo de trabajo bastante común que las personas más sabias que yo ya descubrieron. ¿Alguien puede sugerir algún método o mejores prácticas que puedan agilizar el trabajo en estos escenarios? ¿O hay algo fundamentalmente defectuoso con mi configuration?

Además, ¿Git maneja estos flujos con mayor gracia?

Gracias.

Haría cualquier desarrollo que un cliente requiera en la sucursal del cliente y lo fusionaría en el valor pnetworkingeterminado. Esto funcionará para las revisiones y es más simple que seleccionar los sets de cambios de desarrollo desde la sucursal pnetworkingeterminada. Es más fácil combinar hacia adelante que hacia atrás. También elimina el problema del file tipo B porque no hay files de tipo B en la twig del cliente.

Mecanografíe los files de C que combinaría en pnetworkingeterminado y después elimine en la twig pnetworkingeterminada. Cualquier modificación adicional a estos files debería generar una advertencia de que el file modificado en la twig se eliminó en la otra twig.

Se pueden intercambiar sets de cambios separados entre twigs utilizando los commands hg graft -r SRCREV

Una forma más compleja y probablemente más difícil (pero también más flexible y manejable) puede ser utilizar MQ y más de una queue (¿Cola por tipo?), Pero incluso con una queue de parches MQ con una buena convención de nomenclatura, no se perderá.