代码之家  ›  专栏  ›  技术社区  ›  Oliver Charlesworth

永久反转修补程序文件

  •  35
  • Oliver Charlesworth  · 技术社区  · 14 年前

    有时,不管出于什么原因,我不得不生成(在Linux下)方向错误的补丁文件。我知道我可以用 -R patch ,但如果有一种方法可以永久地反转修补程序文件,那就太好了。是否有一个实用程序可以做到这一点,或例如,一个regex将保证工作?

    更新

    莱恩撒谎了 suggested a neat way of doing this

    3 回复  |  直到 7 年前
        1
  •  52
  •   Tom Hale    6 年前

    interdiff(1) patchutils . 尤其是 interdiff 说:

    要反转修补程序,请使用/dev/null 差异2。

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

    这个 -q / --quiet reverted: 线。

        2
  •  15
  •   Lie Ryan Bryan    14 年前

    尝试:

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

    要反转统一的diff,需要更改三项内容:

    • 补丁头
    • 块头
    • +到-和-到+

    下面是一个补丁头的外观:

    --- 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
    
        3
  •  0
  •   tinker_fairy    9 年前

    我贴了一个补丁 patch -N -p0 < path/file.patch 但由于代码不完整,我开始面临编译问题,我所做的就是运行这个命令 patch -p0 -R < path/file.patch . 提到这个 link