2010-04-16 19 views
7

Estoy intentando contribuir a un proyecto que usa Subversion. Usé Mercurial y su extensión hgsubversión para clonar el repositorio. Mi trabajo tiene lugar en una rama de características.¿Cómo manejar fusiones con hgsubversión?

¿Cómo mantengo actualizada la rama de funciones con las cosas que suceden en la rama predeterminada (hg speak) también conocido como trunk (svn speak)?

Así que usé hg up feature para actualizar a la rama de características, luego hg pull que me dio conjuntos de cambios en la rama predeterminada. Así que hice hg merge default, comprometí la fusión, luego intenté hg push para enviar mis conjuntos de cambios a Subversion. Y Mercurial dijo: "Lo siento, no puedo encontrar el padre svn de una revisión de fusión".

Respuesta

1

Mercurial como unas pocas diferentes modos de ramificación: http://stevelosh.com/blog/2009/08/a-guide-to-branching-in-mercurial/

el que usted está describiendo es 'ramas nombradas', que es el más popular cuando se trabaja con un acuerdo de recompra que se accede sólo a través de mercurio (Hg o -git).

Sin embargo, cuando está utilizando hg-subversion para que esté presionando los cambios a/desde la subversión, que solo nominalmente tiene ramas, es mejor que mantenga todos sus cambios mercuriales en la rama denominada 'predeterminada' y usando el patrón 'clones y ramas' (que prefiero de todos modos).

Específicamente, ese mensaje Sorry, can't find svn parent of a merge revision. no es un descendiente de una revisión que tiene una coincidencia directa en subversión.

Si fuera usted, volvería a reclonear desde svn, y luego movería mi trabajo a la rama 'predeterminada' de ese repositorio con el comando 'trasplante' (extensión empaquetada). Si quieres funciones múltiples en paralelo con subversión hg, utiliza clones separados (son muy baratos), ya que está más en línea con la forma en que subversión piensa en las ramas.

+0

Gracias, Ryan. Pero con su sugerencia, mi trabajo no aparecerá en sentido ascendente (es decir, en Subversion). Quería poder comprometerme con la sucursal de Subversion.En realidad, puedo comprometerme con la sucursal de Subversion, pero no puedo fusionarme desde el tronco en Mercurial. (¿Y cómo Subversion "solo nominalmente" tiene ramas? Parece que el soporte para fusionar ramas en Subversion es más débil que en Mercurial, pero no es demasiado terrible. Al menos puedo bifurcar una rama fuera del tronco y luego fusionarme repetidamente desde el tronco fácil y cómodamente. El problema viene cuando quiero reinsertar la rama en el maletero.) – hibbelig

+0

No he sido claro en mi sugerencia, ya que nada en ella te impide empujar río arriba. Solo sugiero que una vez que tengas los conjuntos de cambios en mercurial te limites a una única rama con nombre, ya que la fusión normal entre las ramas mercuriales te impediría presionar a la subversión (como has visto). Mantén todos tus csets en la misma rama nombrada en tierra mercurial, usando múltiples clones si quieres pistas de desarrollo separadas, y deberías estar bien. –

+0

Gracias una vez más, Ryan. ¿Cómo trabajo con múltiples ramas * Subversion *, entonces? Tenga en cuenta que hice una 'hg merge' de dos ramas existentes en Subversion, y luego quise volver a fusionarla con Subversion. Empujar la combinación falló con el mensaje de error anterior. Si hubiera hecho la misma fusión en el lado de Subversion, la fusión habría llegado intacta en el lado de Mercurial (después de 'hg pull'). – hibbelig

0

que tenía que resolver esto por mí mismo y lo escribí aquí:

http://notebook.3gfp.com/2010/05/pushing-a-new-feature-from-a-mercurial-repo-into-an-svn-repo/

todavía no he encontrado la manera de cerrar una sucursal en la subversión y tienen la gráfica de mercurio parece correcta.

+0

Hola Harvey, estás haciendo la fusión en el lado de Subversion. Hubiera preferido fusionarme en el lado de Mercurial, pero si eso no es posible, entonces así es, supongo. Lástima, sin embargo. Kai – hibbelig

+1

@hibbelig: sí, le pregunté a los autores de hgsubversion acerca de esto y dijeron que es una limitación de svn porque creo que no tienen dos "padres" como hg. Así es como hg sabe sobre la fusión. – Harvey

5

Finalmente he descubierto cómo liberar mi repositorio después de un evento como el descrito en la pregunta, para que pueda continuar trabajando sin tener que volver a clonar el repositorio principal (que es, obviamente, bastante ¡Operación lenta cuando está tirando de Subversion!). Si la "punta" de Subversion te deja atrás para que no puedas empujar más, solo asegúrate de tener activada la extensión "rebase" en tu Mercurial a través de una línea $ HOME/.hgrc como esta:

[extensions] 
rebase = 

y entonces usted debería ser capaz de ejecutar este comando cuando su repositorio queda atrapado:

$ hg rebase --svn 

Si entiendo esto correctamente, se disuelve su rama actual que se ha alejado de la subversión cabeza, y reconstruye la cima la rama "punta" en Mercurial que corresponde a la CABEZA en Subversión. A partir de ahí, puede seguir trabajando y hacer empujes de nuevo con éxito. Siempre me ha funcionado hasta ahora; ¡Déjame saber si surge algún problema!

+1

Terminé usando este comando varias veces. Mi flujo de trabajo para las sucursales locales contra los repos de SVN tiende a ser hg pull, hg rebase --svn, hg push. – MattGWagner

+0

Esta no es una respuesta :-( – Kugel

Cuestiones relacionadas