Windowsに差分パッチを適用するにはどうすればよいですか?


136

差分パッチを作成できるプログラムは世の中にたくさんありますが、私はそれを適用しようとするのに大変な時間を費やしています。パッチを配布しようとしていますが、パッチの適用方法についてユーザーから質問を受けました。それで私は自分でそれを理解しようとしました、そして私には手がかりがなく、見つけることができるツールのほとんどはコマンドラインです。(私はコマンドラインを処理できますが、多くの人々は素敵で使いやすいGUIがなければ失われます。したがって、それらはこの目的には適していません。)

TortoiseSVNを使ってみました。適用したいパッチがあります。パッチを右クリックすると、TortoiseSVNサブメニューの下に「パッチを適用」というオプションがあります。空のウィンドウをプルアップするだけです。

だから私はオープンを打ってみました。マージと統合された差分の適用という2つのオプションがあります。(幸いなことに、パッチは統一されたdiff形式です。)しかし、適用オプションは単純に機能しません。パッチとフォルダーを要求します。どういうわけかそれを求めるのを忘れた、パッチを適用するファイルた!したがって、TortoiseSVNは単純に機能しません。パッチとファイルを取得して適切に適用するWindows GUIベースのユーティリティはありますか?

編集:これまでの返信を見ると、Tortoiseは、すでにバージョン管理されているファイルである場合にのみ正しく実行するようです。ここではそうではありません。SVNリポジトリから取得されなかったファイルにパッチを適用できるようにする必要があります。私はたまたまTortoiseを試してみました。SVNがdiffを使用し、diffを作成して適用する方法を知っている必要があることを知っているからです。


WinMergeの回答は良さそうに聞こえましたが、パッチの作成方法についてのみ説明しており、パッチの適用方法については説明していません。TortoiseHGにはパッチを適用する優れた方法がありますが、私の知る限り、hgリポジトリにあるファイルにのみ適用されます。外部SVN TortoiseDiffがそれを実行できない場合、GUIツールで実行できるかどうか疑問に思います。
ウォーレンP

3
うわー、あなたは正しいです。少なくともWinMergeでは、正解はまだノーです。ここでWinMergeの上の機能要求sourceforge.net/tracker/...
KCD

回答:


32

パッチを適用

TortoiseMergeの場合:

  1. 既存のSVNリポジトリディレクトリを見つけて開く
  2. 「merges」という名前の新しいディレクトリがまだ存在しない場合は作成します
  3. .patchファイルを適用するファイルをコピーします
  4. 次のステップに進む前に、svnリポジトリに追加してコミットします。
  5. マージを右クリックして、パッチの適用...を選択します
  6. リストからファイルをダブルクリックします
  7. パッチが適用されたdiffファイルが右側のペインに表示されます
  8. そのペインをクリックして、[ ファイル]→[名前を付けて保存]で [ 保存]または[エクスポート]をクリックします。

TortoiseMergeから開いた場合の代替画面。以下の画面では、ディレクトリは上記のステップ2で述べた「マージ」ディレクトリを指します。 Screeny

WinMerge GUIのスクリーンショット: Screeny


@WarrenP:はい、TortoiseMergeを使用してパッチを適用する方法を説明しています
Walter Stabosz

4
私のコメントは編集前には意味があり、編集後は意味がありません。まだ混乱していますか?上記の編集タイムスタンプ(2011年3月24日)は、OPが2011年10月以降に彼の回答を再度編集したため、正しくないようです。コメントのタイムスタンプも間違っていると思います。
ウォーレンP

9
@SheriffMd「D:\ Folder is not a working copy」というエラーが表示されませんか?
onmyway133 2013

1
@SheriffMdまた、「フォルダ...は作業コピーではありません」というメッセージも表示されます。バージョン管理されていないファイルにパッチを適用するためにTortoise Mergeを使用するにはどうすればよいですか。
Peter T.

1
@ onmyway133、手順を言い換えました。手順2と手順4を参照してください。「作業コピーではありません」というエラーメッセージは表示されません。
保安官Md

21

そのためだけに純粋なPythonツールを作成しました。予測可能なクロスプラットフォームの動作があります。(これを書いている時点では)新しいファイルを作成せず、GUIがありませんが、グラフィックツールを作成するためのライブラリとして使用できます。

更新:Pythonがインストールされている場合は、これを使用すると便利です。

pip install patch
python -m patch

1
よく使います。@techtonikに感謝します。Python3で動作させることについてのニュースはありますか?
pelson 2015

管理者権限でpipインストールパッチを実行して、機能することを確認します。
Vertexwahn 2016年

@VertexwahnはLinuxにありますか?
anatoly techtonik 2016年

Pythonはどこでも動作します-Windows 10でテストしました
Vertexwahn 2016年

git patchが機能しないWindows 10で動作しました。ありがとうございました!
sqrl0 2017

19

TortoiseMergeは、TortoiseSVNにバンドルされている独立したユーティリティです。

TortoiseDiff.zipアーカイブから個別にダウンロードすることもできます。これにより、バージョン管理されていないファイルに統合されたdiffを適用できます。


21
私の知る限り、これはバージョン管理されていないファイルにパッチを適用することはできません。
pihentagy 2013年

バージョン管理されていないファイルへの適用に問題はありませんでした。
ポールシャノン

他はちょっとしたい:S。
UmNyobe 2014年

1
バージョン1.8.7では、destがバージョン管理されていないというエラーが発生します。
Nick Westgate

15

GUIを使いたいと言っていましたが、コマンドラインツールはうまく機能します。WindowsへのUNIXツールの移植については、GnuWinを参照してください。明らかにpatchコマンドが必要です;-)

ただし、回線の終端で問題が発生する場合があります。GnuWinポートは、パッチファイルがDOSスタイルの行終端(CR / LF)を持っていると想定します。適度にスマートなエディターでパッチファイルを開こうとすると、変換されます。


よく置きます。このコメントがなければ、回線終端の問題を理解できなかっただろう。
ブライアン

行末を処理する別の方法は、コマンドラインに「--binary」オプションを追加することです。
BeReal82 2013年

4
これが私を正しい軌道に乗せた理由です。ただし、Windows 7以降を実行している場合は、毎回UACポップアップが表示されないように、patch.exeのマニフェストを更新する必要があります。方法については、このページを参照してください:math.nist.gov/oommf/software-patchsets/patch_on_Windows7.html
Anttu

1
UACの修正があっても、パッチのGnuWinバージョンはファイルのセキュリティ設定を台無しにします。gitに同梱されているビルドでは、どちらの問題も発生しません。
Artfunkel 2016年

8

TortoiseSVNでは、パッチの適用は機能します。から作成したのと同じディレクトリにパッチを適用する必要があります。これを覚えておくことは常に重要です。TortoiseSVNでの実行方法は次のとおりです。

パッチを適用するフォルダを右クリックします。パッチファイルの場所を尋ねるダイアログが表示されます。ファイルを選択すると、変更されたファイルをリストする小さなファイルリストウィンドウが開き、各項目をクリックすると、そのファイルに対してパッチが実行しようとしていることを示す差分ウィンドウが開きます。

幸運を。


8
それは役に立ちません。宛先ファイルはSVNアーカイブから出されませんでした。(元の投稿の編集を参照してください。)
メイソンウィーラー、

8

Gitインストールのpatch.exeユーティリティはWindows 10で動作します。

Git for Windowsをインストールして"C:\Program Files\Git\usr\bin\patch.exe"から、コマンドを使用してパッチを適用します。

Hunk #1 FAILED at 1 (different line endings).パッチの適用中にのようなエラーメッセージが出力に表示された場合は、コマンドラインに-l(のショートカット--ignore-whitespace)または--binaryスイッチを追加してみてください。


この質問は主に、一般的なコマンドラインツールに慣れていないカジュアルユーザー向けのGUIツールに関するものです。少なくとも例として完全なサンプルコマンドをいくつか提供している場合は、回答がより役立つでしょう。
アルバロ・ゴンサレス

Windowsの10の作曲で動作します
ecdani

7

これを使えますパッチユーティリティのWin32ネイティブポートをます。

それは他のユーティリティのより多くの選択と一緒に来て、Cygwinと類似のものと対照的にそれはどんなDLLか類似のものも必要としません。選択した小さな実行ファイルを選んで、好きな場所に保存してください。

簡単な使い方:

patch.exe -i <patchfile>

さらにヘルプを得る:

patch.exe --help

4
Windows 7でこれに問題がありますpatch.exe。実行しようとすると、新しいCMDウィンドウが開き、管理者権限を要求するプロンプトが表示されます。
Roy Tinker 2013

3
パッチ実行可能ファイルは、Git for Windowsバンドルにも含まれています。
Snicksie 2014年

6
patch.exeの実行で問題が発生している場合は、を含まないものに名前を変更できますpatch。Windowsは、単語patchを含むすべてのexeを疑わしいと見なします。
wbond 2014

2

編集:これまでの返信を見ると、Tortoiseは、すでにバージョン管理されているファイルである場合にのみ正しく実行するようです。ここではそうではありません。SVNリポジトリから取得されなかったファイルにパッチを適用できるようにする必要があります。私はたまたまTortoiseを使ってみました。SVNがdiffを使用していて、diffを作成して適用する方法を知っている必要があるからです。

Cygwinをインストールしてから、コマンドラインパッチツールを使用してパッチを適用できます。パッチに適用されるこのUnix manページも参照してください。


4
うん、できたよ。実際、Cygwinを持っています。私もあなたの解決策を機能させることができたでしょう。ただし、ユーザーにそれを紹介するつもりはありません。最近、Windowsユーザーの何人がコマンドラインを知らないのかご存知ですか?:P
メイソンウィーラー、

2

TortoiseSVN(TortoiseMerge)Index: foobar.py diff / patchファイルの必要とするようです。TortoiseSVNの右クリックで[ パッチを適用 ]でTortoiseSVN以外のパッチファイルを機能させるには、これが必要でしたコマンド。

前:

--- foobar.py.org   Sat May 08 16:00:56 2010
+++ foobar.py   Sat May 08 15:47:48 2010

後:

Index: foobar.py
===================================================================
--- foobar.py
+++ foobar.py   (working copy)

または、貢献者が作業していた特定のリビジョンを知っている場合:

Index: foobar.py
===================================================================
--- foobar.py   (revision 1157)
+++ foobar.py   (working copy)

2

http://www.msys2.org/の MSYS2を使用しています

それはのような多くのユーティリティを提供patchwhichgittree、および多くを。

MSYS2をインストールしたら、パッケージマネージャーを実行してインストールしpatchます。

pacman -S patch

これは、コマンドラインツールをインストールする複雑な方法です。質問のタイトルではなく、質問自体を読んでいると思います。:)
アルバロ・ゴンサレス

1

パッチは、適用するファイルを指示します。ヘッダーは次のようになります(メモ帳またはお気に入りのテキストエディターで表示します)。

--- Folder/old_file
+++ Folder/new_file

Subversionパッチの場合、リビジョン番号も表示されます(ファイル名が同じであるため)。

GNUパッチによりこれらの名前オーバーライドますが、同じことを行うGUIツールはわかりません。さまざまなdiffプログラムを確認しますが、WinMergeがパッチの適用をサポートしていないようです。


いいえ、パッチの上部にはそのようなものはありません。ファイル名とパスを差分自体に含める必要があると言っていますか?誰がそれを考えたのですか?他のフォルダに何かがインストールされている可能性のある人に差分を配布したい場合はどうしますか?
メイソンウィーラー、

パッチの先頭は次のように始まります。--- / +++ / @@ -6,12 +6,12 @@ファイル名も何もありません。組み込みパスはどのように機能するはずですか?XPでパッチを作成し、誰かがVista(またはその逆)でパッチを使用しようとして、Documentsフォルダーへのパスが異なる場合はどうなりますか?
メイソンウィーラー、

1
ファイル名はリポジトリのルートディレクトリを基準にしているため、XP / Vistaフォルダー構造の違いは問題になりません。また、パッチにファイル名を含める理由は、ほとんどのパッチが複数のファイルに影響するためです。
David Z

そうですか。OK、それはもっと理にかなっています。それを片付けてくれてありがとう、David!
メイソンウィーラー、

1

Eclipseはそれを行うことができるはずです。TeamSynchronizeパースペクティブに移動し、次にProject-> Apply patchに移動します。


1

Javaプロジェクトでは、NetBeansを使用してパッチファイルを適用しました。パッチを適用するJavaコードがまだNetBeansプロジェクトでない場合は、そのプロジェクトを作成します。新しいプロジェクトを作成するには:

  • メニューのファイル -> 新規プロジェクトを選択します
  • 表示されるダイアログで、それをJavaアプリケーションプロジェクトにします。ダイアログで名前を付け、をクリックしますFinish
  • プロジェクトの名前を右クリックし、コンテキストメニューから[プロパティ]を選択します。
  • 表示されるダイアログで、[ ソース ]を選択し、ソースフォルダを追加します。Javaソースを参照します。

これでプロジェクトができたので、パッチを適用します。

  • プロジェクトを強調表示して選択します
  • メインメニューから、[ ツール ] -> [ 差分パッチの適用 ]を選択します。
  • 表示されるダイアログで、パッチファイルを参照して選択し、[パッチ]ボタンを押します。

それでおしまい。パッチが適用され、変更を示す差分ウィンドウが表示されます。



1

Mercurialを使用している場合、これは「インポート」を介して行われます。したがって、コマンドライン、hg importコマンド、または(--no-commitオプションが便利なます)、またはHg Workbenchの「リポジトリ」=>「インポート...」。

これらはデフォルトで変更をコミットすることに注意してください。hg import --no-commitコマンドラインを使用している場合、またはHg Workbenchを使用している場合は、このオプションを使用して回避でき ますhg rollback。マージ後に発行すると便利です。


まさに私が探していたもの!コミットを回避する方法を考えていました。
ケシャフ2014年

0

TortoiseSVNを使用してパッチを適用する場合、私は通常、パスをチェックアウトしたリポジトリのルートに保存します。その後、パッチを右クリックし、TortoiseSVNメニューに移動して、ApplyPatchをクリックします。ApplyPatchは、パッチが作成されたディレクトリ階層のどのレベルを自動的に把握する必要があります。

ただし、以前は、新しいファイルを含むパッチを適用したり、ファイルの名前を変更するパッチを適用したりする際に問題がありました。Tortoiseがこれに使用するアルゴリズムは、これらのシナリオをうまく処理できないようです。Unicodeでも同様の問題が発生する可能性があります。


0

モニターは2台ありますか?TortoiseMergeでも同じ問題が発生しており、モニターの1つを無効にすると、ファイルリストの小さなウィンドウが表示されることに気付きました。これがお役に立てば幸いです。


0

「作業コピーではありません」というエラーメッセージが表示される場合は、SVNの作業ディレクトリであるTortoiseMergeダイアログボックスからディレクトリを選択してください。


0

Windows用のBusyBoxポートには、diffコマンドとpatchコマンドの両方がありますが、サポートされるのは統一された形式のみです。


0

ただ使用する:

patch -p0 < path-file.patch

このコマンドは、パッチを作成したフォルダの場所からのみ実行してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.