Essayez:
patch -R file.txt file.patch
diff file.txt.orig file.txt > file.patch.rev
// you can then `rm file.txt.orig file.patch`
EDIT:
Pour inverser un diff unifié, vous devez changer trois choses:
- l'en-tête correctif
- l'en-tête de morceau
- le + à - et - à +
Alors voici comment un en-tête de patch pour un ressemble:
--- b.asm 2010-09-24 12:03:43.000000000 +1000
+++ a.asm 2010-09-24 23:28:43.000000000 +1000
vous avez besoin pour inverser il ressemble à ceci:
--- a.asm 2010-09-24 23:28:43.000000000 +1000
+++ b.asm 2010-09-24 12:03:43.000000000 +1000
fondamentalement changer l'ordre, et le commutateur + ++ à --- et vice versa.
Ensuite, l'en-tête de morceau:
@@ -29,5 +27,7 @@
Vous devez inverser les chiffres, donc ressembler à ceci:
@@ -27,7 +29,5 @@
essentiellement, passer les paires de nombres
et dernier, changez chaque ligne commençant par + et chaque ligne commençant par -.
EDIT:
pour passer l'en-tête de morceau, vous pouvez le faire:
sed -e "s/@@ -\([0-9]\+,[0-9]\+\) +\([0-9]\+,[0-9]\+\) @@/@@ -\2 +\1 @@/"
changer + - et - à +, vous pouvez faire:
sed -e "s/^+/P/" -e "s/^-/+/" -e "s/^P/-/"
FINALEMENT:
pour inverser l'en-tête de patch, on:
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
Alors, enfin, notre script (rapide et sale) ressemble à:
#!/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
Je l'ai testé, et il semble fonctionner.
cependant, pour rendre les choses plus maintenable, et plus propre:
#!/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
ne fonctionne pas. J'ai essayé d'appliquer le correctif inversé au fichier corrigé avec le correctif avant, et cela échoue. Cela ne produit donc pas un correctif inversé correct, du moins pas pour tous les correctifs. Je ne sais pas si interdiff est cassé ou cette méthode est juste fausse – matteo
Je vois, ceci * est * censé fonctionner selon la page de manuel d'interdiff, donc c'est un bug dans interdiff – matteo