2009-07-06 13 views
18

En relación con Mercurial: Merging one file between branches in one repo, intento realizar una operación de retroceso en un solo archivo, aunque ese archivo fue uno de los muchos participantes en la revisión que se retiró.En mercurial, ¿cómo aplico un parche invertido a un archivo en particular?

HG siendo la herramienta orientada a los cambios que es, no quiere operar en los archivos.

Lo más cerca que pude encontrar fue usar hg export para crear un diff, editar a mano el diff, y luego importar hg para parchar el archivo en orden inverso.

..pero entonces llegué a esta situación molesta donde http://hgbook.red-bean.com/read/finding-and-fixing-mistakes.html afirma que hay una opción --reverse a hg patch cuando no lo hay.

Así que lo más parecido que puedo pensar es generar un parche editado a mano como el anterior, y luego usar el parche vainilla -R para aplicar un parche inverso.

El comando hg backout parece ser útil aquí, pero en realidad es una pista falsa.

Tiene que haber una mejor manera, ¿no?

+2

La opción --reverse es * parche *, no * hg parche *. – balpha

Respuesta

22

Puede hacerlo utilizando sólo el -I (incluir nombres que coinciden con los patrones dados) argumento para backout con una sola línea:

hg backout --merge -I thefiletorevert -m 'message' OFFENDINGREVISIONID 

Ejemplo Guión: salida

hg init testrepo 
cd testrepo 
echo -e "line1\n\nline3" > file1 
echo -e "line1\n\nline3" > file2 
hg commit -A -m 'changes to two files' 
perl -pi -e 's/line1/line 1/' file1 
perl -pi -e 's/line1/line 1/' file2 
hg commit -m 'put spaces in line1' 
perl -pi -e 's/line3/line 3/' file1 
perl -pi -e 's/line3/line 3/' file2 
hg commit -m 'put spaces in line3' 
hg backout --merge -I file1 -m 'remove spaces from line1' 1 

Muestra :

adding file1 
adding file2 
reverting file1 
created new head 
changeset 3:6d354f1ad4c5 backs out changeset 1:906bbeaca6a3 
merging with changeset 3:6d354f1ad4c5 
merging file1 
0 files updated, 1 files merged, 0 files removed, 0 files unresolved 
(branch merge, don't forget to commit) 

resultantes Contenido del archivo:

file1:line1 
file1:line 3 
file2:line 1 
file2:line 3 

aviso de que fichero1 falta él es el espacio en línea una después de la anulación del conjunto de cambios medio, y el registro detallado muestra sólo un archivo cambiado en el Backout:

$ hg log -v -r tip 
changeset: 3:6d354f1ad4c5 
tag:   tip 
parent:  1:906bbeaca6a3 
user:  Ry4an Brase <[email protected]> 
date:  Mon Sep 14 12:17:23 2009 -0500 
files:  file1 
description: 
remove spaces from line1 
+0

Creo que entiendo esta solución, pero este caso parece más simple que el mío, ya que aquí está retrocediendo (uno de los archivos en) el cambio de sugerencia, mientras que balpha se ocupa de mi caso más general de anulación de un cambio histórico. – djsadinoff

+1

Naw, esto funcionaría bien para un conjunto de cambios sin punta, aunque requeriría 'hg merge' al final. Sin embargo, aún así terminaría con un gráfico de historial que refleja con precisión lo que sucedió y la familia de los cambios, a diferencia de la copia de balpha, que produciría un registro de cambios lineal. –

+0

Cool. Si publicaras un ejemplo con la anulación de un cambio enterrado, lo marcaría correctamente. – djsadinoff

6

Esto es lo que haría: Utilice una copia nueva de la revisión de la punta.

hg backout --merge -r revision_where_the_change_happened 

para fusionar los cambios invertidos en la copia de trabajo.

Ahora copia el archivo en cuestión a su copia de trabajo regular y se comprometen

hg commit -m "Reversed the changes to file.h made in revision bla" 

y tirar el clon que creó anteriormente.

De esta forma, mercurial no sabe que hay una conexión entre revision_where_the_change_happened y este compromiso. Si quieres mercurial recordar esto, en lugar de hacer una

hg revert {all files except the one in question} 

después de la fusión de la anulación comprometerse en la copia de trabajo y antes de comprometerse. Para la segunda forma, no necesita trabajar en un clon, porque desea mantener el compromiso de restitución.

Supongo que la elección de la forma de usar depende de qué tan grande sea una parte del conjunto de cambios el cambio del archivo en particular.

3

Utilice el comando de revertir.

hg revert -r1 file 

Esto debería volver el contenido del archivo a la versión de revisión 1. A continuación, puede seguir editando y comprometerse con normalidad.

+0

Es correcto que puede restablecer un archivo a una versión anterior como esa. Incluso funcionaría aquí si el archivo no se ha modificado desde la versión incorrecta. Pero si se han realizado más ediciones, entonces una reversión simple no funcionará. En cambio, tendrías que actualizar a la mala revisión, revertir el archivo a una buena versión, hacer una confirmación y unir las dos cabezas. Creo que esto es básicamente lo que hace el retroceso para ti. –

Cuestiones relacionadas