2010-10-17 10 views
8

Tengo 3 repositorios, cada uno creado con la misma base de código pero lo suficientemente diferente como para garantizar diferentes repositorios. Mi flujo de trabajo "ideal" sería hacer trabajo en el repositorio de desarrollo y luego llevar estos cambios a otros repositorios. Sé que puedo hacer esto con algo como:extraer archivos de una revisión específica - mercurial

hg pull -r X -f repo 

pero esto me dará todos los conjuntos de cambios hasta X. ¿Es posible simplemente tirar de todos los conjuntos de cambios de una revisión específica o incluso de una serie de revisiones?

Respuesta

7

Si quiere agarrar los contenidos de ciertos conjuntos de cambios y aplicarlos a un pago y envío arbitraria (nota: los conjuntos de cambios resultantes serán conjuntos de cambios diferentes, aunque cometan los mismos cambios), echar un vistazo en el transplant extension.

+0

Esto casi me da lo que quiero, excepto que cuando ocurre un conflicto, obtengo esos archivos .rej en lugar de llevarme una herramienta de combinación. ¿Conoces alguna forma fácil de manejar esos .rej en lugar de analizarlos manualmente y resolver conflictos? – mdonovan2010

+0

Para los lectores más nuevos que buscan resolver el problema: consulte la respuesta actualizada a continuación para obtener una solución integrada y que funcione bien. – Lstor

8

No hay buena forma para seleccionar las revisiones en mercurial (así se llama el flujo de trabajo propuesto). Hay algunas formas no tan buenas de hacerlo: exportar + importar (o el envoltorio de conveniencia alrededor de exportación + importación llamado trasplante), pero el inconveniente es que tienes el mismo conjunto de cambios con hashes diferentes en repositorios múltiples, sin ningún bien forma de representar eso si/cuando intenta mover los cambios otra vez.

Mejor es modificar su flujo de trabajo para que cuando quiera pasar de un cambio esté bien moviéndose sobre todos sus antepasados, y lo hace al elegir conscientemente los antepasados ​​de un conjunto de cambios.

Por ejemplo, si usted está fijando un error que está en el repositorio de desarrollo, y los tres "otros" repositorios no solo cambia la revisión padre del cambio del tip del repositorio de desarrollo. Primero haz un hg update -r THE_REVISION_WHERE_THE_BUG_WAS_ADDED, luego arregla tu error y luego confirma. Verá un mensaje que dice new head created, que se espera.

Ahora tienes esa corrección como un conjunto de cambios cuyo único elemento primario es el conjunto de cambios en el que se introdujo el error, que debe existir en los otros 3 repositorios o no tendrían el error. Entonces ahora puede pull ese nuevo conjunto de cambios en los "3" otros repositorios sin traer todo lo demás en desarrollo con ellos. Y luego hace un rápido hg merge en cada uno de esos cuatro repositorios que combinan la corrección de errores en su tip desplegable.

Obtener una idea de cómo estructurar repositorios con funcionalidad común pero personalizaciones en cada uno puede ser un poco complicado, pero si estructura bien, puede hacer todas sus migraciones dentro del repositorio utilizando push, pull y merge y nunca tenga que corregir un error dos veces, tener el mismo código en diferentes conjuntos de cambios o volver a hacer la personalización de un repositorio.

Como nota, el comando bisect, hace un gran trabajo respondiendo a la pregunta "¿dónde se introdujo este error?" Antes de comenzar a solucionarlo.

+0

Si estoy entendiendo esto correctamente, ¿este flujo de trabajo funciona si todos los repositorios se pueden rastrear a un conjunto de cambios común? En mi situación, este no es el caso. – mdonovan2010

+0

Sí, reconozco que no es así, pero me refiero a esto sin sonar "sentencioso" que deberían. No importa cuán personalizadas sean sus implementaciones si tienen algún código en común, deberían ser clones con sus propios conjuntos de cambios que realicen la personalización, o deberían compartir subrepos si tienen algún código de biblioteca común entre ellos. Sería un nuevo factor, pero te llevaría al "flujo de trabajo de" sueño "al que haces referencia arriba. –

+0

Sí, es su derecho. Llego tarde a la puerta de embarque con una versión que controla estos sitios web ... mercurial parece ser la elección perfecta para lo que he tenido que hacer, pero refacturar todo solo para lograr mis sueños podría no ser muy feliz para mi empleador;) Gracias por su aporte, definitivamente me ayudó a entender mejor cómo funciona Mercurial) – mdonovan2010

7

respuesta Actualizado: De Mercurial 2 en adelante, se puede utilizar el 'graft' comando que funciona muy bien. Utiliza algunas capacidades de fusión interna para asegurarse de que puede manejar cualquier conflicto de forma manual. Si no hay conflictos que Mercurial no pueda resolver por sí mismo, el nuevo conjunto de cambios se automaticamente se seleccionará y se comprometerá en la parte superior de la revisión actual.

Cuestiones relacionadas