複数のディレクトリのファイルへの単一パッチの適用

複数のディレクトリのファイルへの単一パッチの適用

ディレクトリ構造は次のとおりです。

orig/l1/l2/file2patch

orig/l1-2/file2patch

そして

new/l1/l2/file2patch

new/l1-2/file2patch

これらのファイル間の正確な違いを見つけて1つのファイルとして保存してみましたが、適用が簡単ではないことがわかりました。

patch -d orig/ < patch.diff私はこれを試しましたが、-dパッチするファイルがすぐに存在する必要があると予想しました。orig

ディレクトリでパッチを再生成し、パッチ内の指定されたファイルにパッチを適用する方法はありますか?

答え1

指定されたパス名が正しくないように見えます(特にnew他の人が変更したツリー)、patchこのオプションを使用して、出力で与えられたディレクトリレベルの数を無視するようにプログラムに指示できることを覚えておくことができます。diff-p

パッチファイルに表示されているディレクトリとは異なるディレクトリにあるファイルにパッチを適用するときは、そのディレクトリに移動しcd(一致しない部分をキャンセルするために)、この-pオプションを使用しますcd

以下は、問題を解決した方法を示す短いスクリプトです(簡単なリストのためにGNUパッチのテスト実行オプションを使用)。

#!/bin/sh
cd /tmp/foo
OUT=/tmp/patch.diff
rm -f $OUT
diff -u orig/l1/l2/file2patch new/l1/l2/file2patch >>$OUT
diff -u orig/l1-2/file2patch new/l1-2/file2patch >>$OUT

diffstat -p1 $OUT
cd orig
patch -p1 --dry-run <$OUT

入力する:

$ find . -type f
./new/l1/l2/file2patch
./new/l1-2/file2patch
./orig/l1/l2/file2patch
./orig/l1-2/file2patch

出力:

$ /tmp/xx
 l1-2/file2patch  |   19 +++++++++++++------
 l1/l2/file2patch |    5 ++---
 2 files changed, 15 insertions(+), 9 deletions(-)
/tmp/foo/orig
patching file l1/l2/file2patch
patching file l1-2/file2patch

追加資料:

関連情報