2010-04-23 8 views
7

En los viejos tiempos de Subversion, a veces obtengo un nuevo archivo de uno existente usando svn copy. Luego, si algo cambiaba en las secciones que tenían en común, aún podía usar svn merge para actualizar la versión derivada.En Mercurial, ¿puedo aplicar cambios de un archivo a otro en la misma rama?

Para usar el ejemplo de hginit.com, diga que la receta "guac" ya existe, y quiero crear una "superguac" que incluya instrucciones sobre cómo servir guacamole a 1000 entusiastas del fútbol. Usando el proceso que acabo de describir, pude:

svn cp guac superguac 
svn ci -m "Created superguac by copying guac" 
(edit superguac) 
svn ci -m "Added instructions for serving 1000 raving soccer fans to superguac" 
(edit guac) 
svn ci -m "Fixed a typo in guac" 
svn merge -r3:4 guac superguac 

y por lo tanto la corrección de error se aplicaría a superguac.

Mercurial proporciona un comando hg copy que marca un archivo como una copia del original, pero no estoy seguro de que la estructura del repositorio sea compatible con un flujo de trabajo similar. Aquí está el mismo ejemplo, y yo cuidadosamente única editar un único archivo en el comprometo quiero utilizar en la combinación:

hg cp guac superguac 
hg ci -m "Created superguac by copying guac" 
(edit superguac) 
hg ci -m "Added instructions for serving 1000 raving soccer fans to superguac" 
(edit guac) 
hg ci -m "Fixed a typo in guac" 

ahora quiero aplicar el cambio en el guacamole a superguac. ¿Es eso posible? Si es así, ¿cuál es el comando correcto? ¿Hay un flujo de trabajo diferente en Mercurial que logra los mismos resultados (limitado a una sola rama)?

+0

reconozco este ejemplo en particular es bastante fácil de refundición utilizando ramas y Mercurial resuelve esa situación trivial. Desafortunadamente, en mi aplicación real necesito ambos archivos en la misma rama, de ahí mi dificultad ... – Stephen

+0

Después de pensar en esto más (y probar ambas soluciones en mi repositorio), creo que ambas respuestas tienen sus méritos. Si hubiera sabido la respuesta de Rudi anteriormente, todas las modificaciones que se apliquen a ambos archivos podrían usar su método. Desafortunadamente, desde que edité ambos archivos después de la copia, la solución de Ry4an me proporciona una solución alternativa. ¡Gracias a ambos! – Stephen

Respuesta

6

Usted puede hacer esto mediante

hg cp guac superguac 
hg ci -m "Created superguac by copying guac" # CS1 
(edit superguac) 
hg ci -m "Added instructions for serving 1000 raving soccer fans to superguac" # CS2 
hg up -r revision-before-copy 
(edit guac) 
hg ci -m "Fixed a typo in guac" #CS3 
hg merge # this will transfer the typo-fix both to guac and superguac 
hg ci -m "merged typo-fix from guac" # CS4 

Después de esto el repositorio se parece a esto

CS1 <--- CS2 <--------- CS4 
    \     /
    \--<-------- CS3 -<-/ 
+0

Oh, eso es furtivo ... (aunque supongo que desde el punto de vista correcto no lo es) Entonces, tu solución crea múltiples cabezas y luego las combina.Pero en un nivel más profundo, este método "inserta" un cambio en la historia de superguac fuera del orden cronológico. ¡Eso es genial, y creo que mi modelo mental de DVCS acaba de mejorar! ¡Gracias! – Stephen

+0

Uno de los puntos de aclaración que DVCS tiene sobre CVCS es que este último obliga a mirar el historial de compromiso de forma más lineal, y en términos de "revisiones". El primero tiene un DAG en el corazón de su modelo de historia, que es mucho más flexible, y debería pensar en compromisos como conjuntos de "cambios". – Santa

+0

@Santa He leído sobre el DAG, pero creo que todavía no lo había internalizado. Este es un muy buen ejemplo para ayudarme a anclar lo que el DAG realmente significa en DVCS (y también lo estoy compartiendo en la oficina para ayudar a otros a comprender el concepto). – Stephen

9

No hay forma pura mercurial que ir a través del archivo con los parches, pero si patch está instalado en su sistema que podría lograr esencialmente la misma cosa mediante el seguimiento de su serie de comandos mercuriales con:

hg log -p -r tip -I quac | patch superquac 

eso es esencialmente diciendo: "tomar el diff (-p) que se aplicó a presentar quac (-I quac) en el último conjunto de cambios (-r tip) enviarlo a la salida estándar (hg log), y usar eso como la entrada al parche (| patch) comando actuando en fi le superquac (superquac).

+0

Hm ... Para una solución que no sea hg, esto es agradable y conciso. También me pregunto si una extensión de hg podría estar en orden. ¡Gracias! – Stephen

+0

Mayhaps. Me salté svn, pasando de CVS directamente a mercurial, así que nunca supe que svn tenía esa funcionalidad. Honestamente, suena como algo que desalentaría la buena refactorización del tipo que evita hacer el mismo parche en múltiples archivos. –

+0

A juzgar por lo que dice 'hg help log', también debería ser posible especificar otra rama ('--branch BRANCH') e incluso transferir los cambios desde un archivo diferente en una rama diferente. – Tobias

Cuestiones relacionadas