En hg, ¿cómo puedo soltar el nombre de la twig cuando realizo una rebase y / o trasplante desde otro repository?

Básicamente, lo que quiero probar es sacar las revisiones de hg de una twig de un repository experimental a un clon de línea principal. Pero quiero descartar el nombre de la twig para poder ingresar directamente al repository principal del lado del server. Probablemente sea mejor dar un ejemplo simple:

hg init hg_mainline pushd hg_mainline touch foo hg add foo hg commit -m 'foo' popd hg clone hg_mainline hg_experimental pushd hg_experimental hg branch bar_branch touch bar hg add bar hg commit -m 'bar' popd pushd hg_mainline hg pull ../hg_experimental hg log 

Como puede ver, la línea principal ahora incluye una revisión con "branch: bar_branch". No quiero que esta revisión tenga una twig (es decir, debería ser la pnetworkingeterminada).

Está bien si esto requiere reescribir el historial con rebase , trasplante u otra herramienta. He intentado ambos, pero no pude hacerlo funcionar. El hash de revisión más reciente puede terminar diferente entre los dos repos.

Así que quiero que la revisión más alta de hg_mainline se vea así:

 changeset: 1:xxxxxxxxxxxx tag: tip user: ... date: ... summary: ... 

sin una twig con nombre.

De nuevo, está bien si el hash no se conserva de hg_experimental.

Actualmente estoy usando hg 1.6.2 + 55-18e1e7520b67 desde un PPA de Ubuntu.

EDITAR:

También utilicé 1.3.1. Probé lo siguiente en ambos, y los resultados aquí son los mismos.

Lo conseguí trabajando con trasplante, pero solo con grep -v kludge.

 hg transplant -s ../hg_experimental 1 --filter "grep -v '^branch:'" 

Con:

 hg transplant -s ../hg_experimental 1 

La export de hg tampoco funcionó, con o sin un grep apropiado.

El parche changeset se ve así:

 # HG changeset patch # User Matthew Flaschen <EMAIL> # Date 1282942390 14400 # Branch bar_branch # Node ID b8e36efea72642f0a0194301489d5c48f619a921 # Parent 85d9b9773d4ec09676dfcc4af89c142c46279444 bar 

Exporté de experimental con:

 hg export 1 -o '/tmp/%b_%H_%R' 

e intentó importar a la línea principal con:

 hg import /tmp/hg_experimental_b8e36efea72642f0a0194301489d5c48f619a921_1 

Falla con:

 abort: no diffs found 

EDICION 2:

Como se indicó, el método de export falló solo porque los files estaban vacíos. Funciona correctamente con --git o con files no vacíos.

La solución más simple es usar la hg export desde el repository experimental, y la hg import al repository principal. De forma pnetworkingeterminada, la hg import no aplicará ninguna información de bifurcación en el parche. La desventaja es que se mostrarán como diferentes sets de cambios en los dos repositorys hg incoming en el repository experimental que mostrarán los cambios que acaba de exportar / importar, por lo tanto, después de hacer esto, será mejor que elimine y vuelva a crear el Repo experimental si planeas hacer más experimentación.

EDIT: desde el repository hg_mainline :

 hg export -r 1 -R ../hg_experimental | hg import - 

EDIT2: De hg help diffs :

El formatting pnetworkingeterminado de Mercurial para mostrar los cambios entre dos versiones de un file es compatible con el formatting unificado de GNU diff, que puede ser utilizado por el parche de GNU y muchas otras herramientas estándar.

Si bien este formatting estándar suele ser suficiente, no codifica la siguiente información: (recorte)

  • creación o eliminación de files vacíos

Los files de testing están vacíos en su script de testing, por lo que debe ingresar algo en ellos o usar la opción --git para hg export .

La extensión de trasplante ya elimina el nombre de la sucursal:

 cd hg_mainline hg transplant -s ../hg_experimental 1 

debería hacerlo por ti. Si encuentra que ese no es el caso, siempre puede usar el --filter modificar los sets de cambios (tal vez simplemente usando grep -v ) al --filter .

Notaré que si puede get un flujo de trabajo que evite el trasplante y conserve hashes, estará mejor. Evitar las sucursales con nombre hace que todo sea más fácil: las sucursales anónimas tal vez con marcadores funcionan igual o mejor.