web-dev-qa-db-ja.com

更新するディレクトリ全体のパッチを作成する方法は?

これにはすでにいくつかのスレッドがありますが、パッチファイルを作成するための初期diffの実行方法、およびapplyパッチを初期ディレクトリに更新して更新する方法については、誰も完全に説明していません。

私の場合、誰でもWebからダウンロードできるファイルのディレクトリがあります。そのディレクトリを取得して変更を加えたので、ダウンロードしたディレクトリに他の人がそれを適用できるようにパッチファイルを作成して、変更したディレクトリにあるものを正確に再現したいと思います。

助けて?パッチの適用方法に関して、他の人に何を伝える必要がありますか?

63
poundifdef

私はちょうどこの同じ問題を抱えていた-それを半分にする方法に関する多くのアドバイス。さて、パッチとパッチの両方を機能させるために私がしたことは次のとおりです。

パッチファイルを作成するには:

  1. たとえば、両方のディレクトリのコピーを/ tmpに入れて、パッチファイルを作成できるようにします。

  2. 古いディレクトリと新しいディレクトリの2つのディレクトリで適切な差分を実行します。

    diff -ruN orig/ new/ > file.patch
    # -r == recursive, so do subdirectories
    # -u == unified style, if your system lacks it or if recipient
    #       may not have it, use "-c"
    # -N == treat absent files as empty
    

ユーザーがorig /ディレクトリを持っている場合、パッチを実行して新しいディレクトリを再作成できます。

古いフォルダーとパッチファイルから新しいフォルダーを再作成するには:

  1. Orig /フォルダーが存在するディレクトリにパッチファイルを移動します

  2. このフォルダは上書きされるため、どこかにバックアップを保存するか、コピーを使用します。

    patch -s -p0 < file.patch
    # -s == silent except errors
    # -p0 == needed to find the proper folder
    
  3. この時点で、orig /フォルダーにはnew /コンテンツが含まれていますが、古い名前が残っているため、次のようになります。

    mv orig/ new/    # if the folder names are different
    
119
David H

オープンソースのScarab C++ライブラリを確認してください: https://github.com/loyso/Scarab

それはまさにあなたが説明したことを行います。 xdeltaライブラリを使用してファイルごとの差分を構築し、アーカイブパッケージに配置します。そのパッケージを再配布して、差分を適用できます。 Win32用のバイナリがあります。

私はScarabプロジェクトの著者です。

1
Alexey Baskakov

パッチファイルを作成して、誰かに送信して、自分のディレクトリに合わせてディレクトリを更新する必要がありました。 diff および patch には多くの注意事項がありますが、そのため概念的にシンプルなものを見つけるのに何時間もかかりました。絶対パスは相対パスよりも優先されるように思われ、多くのオプションはニッチなユースケースから発展したようです。 David Hの答え に基づいたソリューションを最終的に見つけました。 Lakshmanan Ganapathy )からの追加のヒントもあります:

  • directorydirectory.origにバックアップします
  • directoryを変更して、目的の状態に到達します
  • directory.origからfile.patchdirectoryへの差分を保存して、受信者の名前が一致するようにします

私のメモは次のとおりです。

# to create patch:
# copy <directory> backup to something like <directory>.orig alongside it
cp -r <path_to>/<directory> <path_to>/<directory>.orig
# create/update/delete files/folders in <directory> until desired state is reached
# change working directory to <directory>
cd <path_to>/<directory>
# create patch file alongside <directory>
diff -Naru ../<directory>.orig . > ../file.patch
# -N --new-file Treat absent files as empty.
# -a --text Treat all files as text.
# -r --recursive Recursively compare any subdirectories found.
# -u -U NUM --unified[=NUM] Output NUM (default 3) lines of unified context.

# to apply patch:
# change working directory to <directory>
cd <path_to>/<directory>
patch -s -p0 < <path_to>/file.patch
# -s or --silent or --quiet Work silently, unless an error occurs.
# -pN or --strip=N Strip smallest prefix containing num leading slashes from files.

# to undo patch (note that directories created by patch must be removed manually):
# change working directory to <directory>
cd <path_to>/<directory>
patch -Rs -p0 < <path_to>/file.patch
# -R or --reverse Assume that patch was created with the old and new files swapped.
# -s or --silent or --quiet Work silently, unless an error occurs.
# -pN or --strip=N Strip smallest prefix containing num leading slashes from files.
1
Zack Morris