2010-12-01 7 views
6

La pregunta es similar a this (sin respuesta) y this one (el mismo problema no involucra a Git)."Hg a Hg (puerta de enlace) a SVN" en comparación con "Git a Git (puerta de enlace) a SVN"

El objetivo es hacer que Hg sea una interfaz para SVN durante un período de tiempo antes de pasar por completo a Hg.

La configuración probablemente debería verse como la que se muestra a continuación (igual que en las preguntas mencionadas anteriormente), sin embargo, no estoy seguro acerca de la topología exacta de los repositorios intermedios de Hg.

Dev1 Hg --> Hg <--> SVN 
Dev2 Hg -/ 

sé que la configuración anterior funciona con git y git-svn como se describe en this comment:

Dev1 Git --> Git (bare) <--> Git (bridge) <--> SVN 
Dev2 Git -/ 

Configuración:

  1. De cualquier git svn init, o git svn clone el repositorio SVN. Esto se convierte en el "puente Git/SVN".

  2. Repare cualquiera de las ramas, etiquetas, etc. ... aquí. Los refs svn/* se consideran controles remotos, por lo que si desea rastrear sucursales, verifique estos controles remotos y cree las sucursales locales apropiadas. Además, verifique las etiquetas y cree etiquetas reales. DEBE crear sucursales locales para cualquier rama SVN que desee sincronizar entre Git y SVN.

  3. Ahora, cree un nuevo repositorio vacío (git init) en algún lugar, y desde el puente, empuje todas las ramas al repositorio desnudo (git push –tags).

  4. Todos los usuarios de Git ahora clonan este repositorio simple. El puente solo lo mantendrán una (o algunas) personas que entiendan cómo sincronizar Git y SVN.

Para actualizar el tronco SVN con los cambios en el maestro, y viceversa, desde el puente:

  1. git svn fetch (conseguir nuevos cambios SVN)

  2. git checkout master

  3. git pull master (obtenga cambios de Git del repositorio desnudo)

  4. git checkout svn/trunk (cabeza separada checkout)

  5. git merge –no-ff –log master (fusionar los cambios de maestro). –no-ff asegura una confirmación real, –log copia los mensajes de registro individuales de cada confirmación en el maestro (–log es opcional). git commit -amend se puede ejecutar si desea editar el mensaje de confirmación.

  6. git svn dcommit (Esto empuja la combinación de comprometerse a SVN. Tenga en cuenta que el envío de datos estaba en una cabeza separada, y ya no es accesible). Todo su trabajo en master (desde la base de combinación de master y svn/trunk) se compromete como un único cambio, y ahora está disponible para usuarios de SVN.

  7. git checkout master

  8. git merge svn/trunk (Obtiene las nuevas actualizaciones de SVN - con el mensaje alterado comprometerse - y se fusiona con maestría)

  9. git push barerepo (hace cambios en el SVN disposición de los usuarios Git)

Lo que no sé es si es posible de alguna manera replicar lo anterior en Hg. Tal como lo veo (yo soy un usuario de Git intermedio y sé lo básico de trabajar con Hg), los obstáculos en Hg son:

  • no hay ramas de seguimiento a distancia (es esto posible con bookmarks repos clonados por separado??)
  • imposible empujar fusión se compromete a través de hgsubversion (paso n. 6 de la lista anterior. ¿Qué impide hgsubversion de hacer lo svn dcommit hace?)

¿es posible que la pasarela funcione Hg-SVN en el mismo moda la pasarela Git-SVN funciona? Si no, ¿por qué?

Respuesta

1

La versión corta es: nadie todavía me convenció de lo que debe ser el comportamiento esperado razonable de empujar una fusión a Subversion, y hay algunas ligeras modificaciones a hgsubversion recomendable hacer empujando consecuencia de fusiones en lugar de las revisiones rebasada. Nada de eso debería ser demasiado difícil, simplemente lleva a alguien motivado a hacer la implementación. Si tiene curiosidad, this thread tiene una solicitud similar en la que respondí con una discusión bastante profunda sobre el enfoque básico que he pensado con un par de otros.