2010-10-21 28 views
16

Comencé a trabajar en un repositorio SVN. He clonado una subcarpeta de ella en un repositorio de Hg local con hg clone.Envío de cambios de Hg a SVN

Después, quería compartir esto con un colega que no tiene acceso al repositorio SVN. Creé un repositorio privado de BitBucket, y ocasionalmente presionamos los cambios, y por lo tanto tuve que sacarlos.

hgsubversion hace algunas cosas desagradables a los conjuntos de cambios, como cambiar su committer (y creo que incluso el hash). Cuando traté de empujar y tirar al repositorio BitBucket, tuve que hacer una fusión.

Ahora no puedo volver a enviar los cambios al repositorio de Subversion debido a nuestro querido amigo, abort: Sorry, can't find svn parent of a merge revision..

¿Cómo se podría extraer el repositorio Mercurial BitBucket-targetting con el repositorio Mercurial svn-targetting, mientras se mantiene compatible con hgsubversion (es decir, sin importar las revisiones de fusión)?

Se apreciaría, por supuesto, una forma automática de hacer esto, pero si no existe una forma fácil de hacerlo, le agradecería cualquier solución.

Yo uso hgsubversion, no hgsvn; es decir, la extensión en la que uno hace hg clone svn://repo/url. Sin embargo, estoy dispuesto a cambiar, si es necesario.

+1

No está claro si utiliza hgsvn o hgsubversion (diferentes herramientas). – tonfa

+0

¡Perdón por no ser claro! Yo uso hgsubversion (la extensión). Pregunta actualizada –

Respuesta

21

Cuando utiliza Mercurial en un repositorio de subversión, debe seguir pensando que SVN sí lo hace, por lo que muchas funciones que forman parte del flujo de trabajo básico de mercurial simplemente no funcionarán. Fusionar la forma en que mercurial lo hace es imposible en un depósito svn. Si ha fusionado su trabajo con la rama SVN tirado, obtendrá el infame sobre el mensaje que está recibiendo ahora :(

le sugiero que lea la respuesta del durin42 a this question

EDIT:. Para salir de su desorden actual, le sugiero que cree un parche (o una serie de parches) desde el punto de pago del repositorio SVN. Obtenga una nueva copia nueva del repositorio de subversión y aplique los parches. No estoy seguro de que ' será capaz de hacerlo desde tu repositorio actual. se puede explorar el comando hg diff.

hg diff -g -r tip -r XXX > patch 

con XXX ser su SVN originales comprobación (todavía no lo he probado)

+0

-1. Estoy tratando de encontrar una manera de convertir un repositorio de hg en un repositorio de hgsubversion después de haberlo estropeado con operaciones solo de hg. "No puedes hacerlo, y no deberías hacerlo". Podría hacerlo yo mismo, pero de todos modos quiero importar los cambios nuevamente en el repositorio de Subversion, aplanando el historial pase lo que pase. –

+0

Comprender por qué no funcionó es el primer paso para encontrar una solución. Actualicé mi respuesta esperando que esto ayudara. No estoy en una computadora con mercurial instalado, por lo que no he probado. Pero esa es la forma en que probaría eso. –

+0

Escribiré un script que elimine diffs incrementales, pero también conserva los mensajes de registro. -1 => +1, y aceptar. ¡Gracias! –

10

Sí, hgsubversión cambia el nombre del confirmador porque debe reflejar el nombre asignado por Subversion. Hgsubversion debe luego también cambia el hash changeset. En realidad, no es algo que hgsubversión pueda decidir: en el diseño de Mercurial está incorporado que el hash del conjunto de cambios se basa en toda la información del conjunto de cambios y que incluyó el nombre del committer.

Lea mi hgsubversion guide para obtener información sobre cómo trabajar correctamente con hgsubversion. Los puntos importantes a recordar es que hgsubversion convierte hg en un mejor svn, pero aún así Subversion es el maestro. Esto significa que debe linealizar su historial antes de volver a empujarlo a Subversion para que no se fusione u otras cosas divertidas de DVCS.

Si desea aprovechar las características distribuidas en Mercurial, hágalo en iteraciones pequeñas: colabore en Mercurial, linealice los conjuntos de cambios y vuelva a presionar Subversion, destruya la parte no lineal de sus clones, sacar de Subversion. Luego puede repetir con nuevas iteraciones de colaboración en Mercurial.

+0

¡Gracias! Vota arriba; como mencioné en otro comentario, escribiré una secuencia de comandos para linealizar el historial de forma manual, conservando solo el contenido del conjunto de cambios y los mensajes de registro. –

0

me acaba de golpear un problema similar, que básicamente era:

  • clonar un repositorio SVN con HgSubversion
  • trabajar hacia fuera con algunas fusiones
  • tratando de tirar de nuevo a la antigua repositorio SVN

y se encontró con el temible mensaje Sorry, can't find svn parent of a merge revision.

Eso es lo que hice para solucionarlo sin demasiados problemas:

  1. Descargar TortoiseSVN de this link e instalarlo.
  2. Revise el repositorio SVN en una nueva carpeta usando el comando SVN Checkout... desde el menú contextual del Explorador de Windows (haga clic con el botón derecho para acceder).
  3. Copie el contenido de la carpeta local HG (excluyendo la subcarpeta .hg solamente) a la carpeta SVN recién creada, sobrescribiendo todos los archivos.
  4. Haga clic derecho en esa carpeta y haga SVN Commit....
  5. Basura su repositorio HG y retírelo del repositorio SVN ahora actualizado.

Tarda 2 minutos y todo debería comenzar a funcionar de nuevo. Perderá algo de merge & información de confirmación, pero no debería ser un problema ya que el combo SVN/HgSubversion no puede rastrearlos de todos modos.

Cuestiones relacionadas