永久性地反转补丁文件

时间:2010-10-10 22:00:43

标签: linux diff patch

有时,无论出于何种原因,我都必须生成错误方向的补丁文件(在Linux下)。我知道通过-R应用patch开关时可以使用{{1}}开关处理这个问题,但如果有一种方法可以永久性地反转补丁文件,那就太好了。是否有可以执行此操作的实用程序,或者例如一个可以保证有效的正则表达式?

更新

Lie Ryan有suggested a neat way of doing this。但是,它需要访问原始源文件。所以我想我应该更新我的问题,说明我更多的是在一种方法实现这一点,只给出补丁文件本身。

3 个答案:

答案 0 :(得分:48)

您可以使用patchutils中的工具interdiff(1)。特别是interdiff的手册页说:

  

要反转补丁,请使用/ dev / null   DIFF2。

所以,

$ interdiff -q file.patch /dev/null > reversed.patch

-q / --quiet阻止插入reverted:行。

答案 1 :(得分:15)

尝试:

patch -R file.txt file.patch
diff file.txt.orig file.txt > file.patch.rev
// you can then `rm file.txt.orig file.patch`

编辑:

要反转统一差异,您需要更改三件事:

  • 补丁标题
  • 块头
  • + to - and - to +

所以这里是一个看起来像的补丁头:

--- b.asm   2010-09-24 12:03:43.000000000 +1000    
+++ a.asm   2010-09-24 23:28:43.000000000 +1000

你需要反转它,看起来像这样:

--- a.asm   2010-09-24 23:28:43.000000000 +1000
+++ b.asm   2010-09-24 12:03:43.000000000 +1000    

基本上切换顺序,并将+++切换到---反之亦然。

接下来,块头:

@@ -29,5 +27,7 @@

您需要撤消数字,因此它看起来像这样:

@@ -27,7 +29,5 @@
基本上,切换数字对

并且最后,切换以+开头的每一行以及以 - 。

开头的每一行

修改

切换块头,你可以这样做:

sed -e "s/@@ -\([0-9]\+,[0-9]\+\) +\([0-9]\+,[0-9]\+\) @@/@@ -\2 +\1 @@/"

切换+到 - 和 - 到+,你可以这样做:

sed -e "s/^+/P/" -e "s/^-/+/" -e "s/^P/-/"

<强>最后:

要反转补丁标题,请执行:

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

所以,最后,我们的(快速和脏)脚本看起来像:

#!/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

我测试了它,似乎有效。

但是,为了使事情更易于维护和清洁:

#!/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

答案 2 :(得分:0)

我已经应用了补丁patch -N -p0 < path/file.patch,但由于代码不完整,我开始面临编译问题,我所做的只是运行此命令patch -p0 -R < path/file.patch。推荐此link