web-dev-qa-db-ja.com

パッチファイルを完全に元に戻す

時々、何らかの理由で、間違った方向にあるパッチファイル(Linuxの下で)を作成しなければなりません。 patchを介して適用するときに-Rスイッチを使用することでこれに対処できることは知っていますが、パッチファイルを永続的に元に戻す方法があればいいのですが。これを行うことができるユーティリティはありますか、または例えば動作が保証される正規表現?

[〜#〜]更新[〜#〜]

Lie Ryanは これを行うためのきちんとした方法を提案しました 。ただし、元のソースファイルにアクセスする必要があります。ですから、パッチファイル自体だけを考えれば、これを達成する方法がもっと必要だと言うように質問を更新する必要があると思います。

37

ツールinterdiff(1) from patchutils を使用できます。特に、interdiffのマニュアルページには次のように書かれています。

パッチを元に戻すには、diff2に/ dev/nullを使用します。

そう、

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

-q / --quietは、reverted:行の挿入を防ぎます。

52
camh

試してみてください:

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

編集:

統一された差分を元に戻すには、次の3つを変更する必要があります。

  • パッチヘッダー
  • チャンクヘッダー
  • +から-および-から+

したがって、のパッチヘッダーは次のようになります。

--- 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
15
Lie Ryan

パッチを適用しましたpatch -N -p0 < path/file.patchしかし、コードが不完全なためにコンパイルの問題に直面し始めました。このコマンドを実行するだけでしたpatch -p0 -R < path/file.patch。これを参照 リンク

0
tinker_fairy