Revertir permanentemente un archivo de parche
A veces, por cualquier razón, tengo que producir archivos de parche (bajo Linux) que están en la dirección equivocada. Sé que puedo lidiar con esto usando el interruptor -R
al aplicarlo a través de patch
, pero sería bueno si hubiera una forma de revertir permanentemente el archivo de parche. ¿Hay alguna utilidad que pueda hacer esto, o por ejemplo, una expresión regular que se garantizaría que funcione?
ACTUALIZACIÓN
Lie Ryan ha sugerido una forma ordenada de hacer esto . Sin embargo, requiere acceso a los archivos fuente originales. Así que supongo que debo actualizar mi pregunta para indicar que estoy más después de una forma de lograr esto dado solo el archivo de parche en sí.
3 answers
Puede utilizar la herramienta interdiff(1)
desde patchutils. En particular, la página de manual de interdiff
dice:
Para invertir un parche, use /dev / null para dif2.
Así que,
$ interdiff file.patch /dev/null > reversed.patch
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-10-10 23:54:13
Intenta:
patch -R file.txt file.patch
diff file.txt.orig file.txt > file.patch.rev
// you can then `rm file.txt.orig file.patch`
EDITAR:
Para revertir un diff unificado, necesitas cambiar tres cosas: {[11]]}
- el encabezado del parche
- el encabezado del fragmento
- el + a - y - a +
Así que así es como se ve un encabezado de parche para a:
--- b.asm 2010-09-24 12:03:43.000000000 +1000
+++ a.asm 2010-09-24 23:28:43.000000000 +1000
Necesitas invertirlo para que se vea así:
--- a.asm 2010-09-24 23:28:43.000000000 +1000
+++ b.asm 2010-09-24 12:03:43.000000000 +1000
Básicamente cambia el orden, y cambia +++ a --- y viceversa.
A continuación, el trozo cabecera:
@@ -29,5 +27,7 @@
Necesitas invertir los números, para que se vea así:
@@ -27,7 +29,5 @@
Básicamente, cambiar los pares de números
Y por último, cambie cada línea que comienza con + y cada línea que comienza con -.
EDITAR:
Para cambiar el encabezado del fragmento, puede hacer:
sed -e "s/@@ -\([0-9]\+,[0-9]\+\) +\([0-9]\+,[0-9]\+\) @@/@@ -\2 +\1 @@/"
Para cambiar + a - y-a+, puede hacer:
sed -e "s/^+/P/" -e "s/^-/+/" -e "s/^P/-/"
FINALMENTE:
Para invertir el encabezado del parche, haga:
head -2 orig.diff | tac | sed -e "s/+++/PPP/" -e "s/---/+++/" -e "s/PPP/---/" > head
tail orig.diff -n+3 > tail
cat head tail > headtail
rm head tail
Así que, finalmente, nuestro (rápido y sucio) script parece:
#!/usr/bin/env sh
F="$1"
head -2 $F | tac | sed -e "s/+++/PPP/" -e "s/---/+++/" -e "s/PPP/---/" > $F.head
tail $F -n+3 | sed -e "s/@@ -\([0-9]\+,[0-9]\+\) +\([0-9]\+,[0-9]\+\) @@/@@ -\2 +\1 @@/" -e "s/^+/P/" -e "s/^-/+/" -e "s/^P/-/" > $F.tail
cat $F.head $F.tail
rm $F.head $F.tail
Lo probé, y parece funcionar.
Sin embargo, para hacer las cosas más mantenibles y más limpias:{[11]]}
#!/usr/bin/env sh
swap() {
sed -e "s/^$1/PPP/" -e "s/^$2/$1/" -e "s/^PPP/$2/"
}
file_header() {
head -2 $1 | tac | swap +++ ---
}
fix_chunk_header() {
sed -e "s/@@ -\([0-9]\+,[0-9]\+\) +\([0-9]\+,[0-9]\+\) @@/@@ -\2 +\1 @@/"
}
fix_lines() {
swap + -
}
file="$1"
file_header $file
tail $file -n+3 | fix_chunk_header | fix_lines
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-10-10 23:39:13
Había aplicado un parche patch -N -p0 < path/file.patch
pero empecé a enfrentarme a problemas de compilación debido a código incompleto todo lo que hice fue ejecutar este comando patch -p0 -R < path/file.patch
. Se refiere a este enlace
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-07-06 10:23:55