Pregunta En mercurial, ¿cómo aplico un parche inverso a un archivo en particular?


Relacionado con Mercurial: fusionar un archivo entre sucursales en un repositorio , Estoy intentando 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ó.

HG es la herramienta orientada al conjunto de cambios que es, no quiere operar en archivos.

Lo más cerca que pude encontrar fue usar hg export para crear un diff, editar a mano el diff, y luego importarlo 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 para hg patch  cuando no hay

Entonces, lo más cercano 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.

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

Tiene que haber una mejor manera, ¿no?


18
2017-07-06 09:33


origen


Respuestas:


Puedes hacerlo usando solo el -I (incluya nombres que coincidan con los patrones dados) argumento para el retroceso con una sola línea:

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

Ejemplo de secuencia de comandos:

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 de salida:

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)

Contenido resultante del archivo:

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

observe que falta el archivo 1, es espacio en la línea uno después del retroceso del conjunto de cambios del medio, y el registro detallado muestra solo un archivo modificado en el retroceso:

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

22
2017-07-07 04:31



Esto es lo que haría: usar un clon nuevo de la revisión de la propina.

hg backout --merge -r revision_where_the_change_happened

fusionar los cambios invertidos en la copia de trabajo.

Ahora copie el archivo en cuestión a su copia de trabajo normal y comprométalo

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

y tira el clon que creaste arriba.

De esta manera, mercurial no sabe que hay una conexión entre revision_where_the_change_happened y esto compromete Si desea que mercurial lo recuerde, en su lugar, haga una

hg revert {all files except the one in question}

después de fusionar la confirmación de restitución 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 cuán grande sea la parte del conjunto de cambios que fue el cambio del archivo en particular.


6
2017-07-06 10:24



Use el comando de revertir.

hg revert -r1 file

Esto debería revertir el contenido del archivo a la versión en la revisión 1. Luego puede editarlo y comprometerse normalmente.


3
2017-07-10 10:04