パッチの作成及び適用

(TortoiseSVN のような) オープンソースプロジェクトでは、リポジトリは誰もが読み込みアクセスできるようになっていて、誰もがプロジェクトに貢献できるようになっています。では、どのように貢献をコントロールするのでしょう? 誰もが変更をコミットできるようにすると、プロジェクトは永久に不安定になり、ややもすると永久に壊れた状態になるかもしれません。こういった状況では、変更を開発チーム (書き込む権限がある) への パッチ ファイルの送信といった形で管理しています。開発チームはまずパッチをレビューし、リポジトリに送信したり、拒否して作者に返却したりします。

パッチファイルはシンプルな Unified-Diff ファイルで、作業コピーと元になったリビジョンとの差分を表しています。

パッチファイルの作成

まず、変更したものの make とテスト をする必要があります。それから、親フォルダで TortoiseSVNコミット... する代わりに、TortoiseSVNパッチを作成... を選択してください、

図4.43 パッチ作成ダイアログ

パッチ作成ダイアログ

ここで完全なコミットをするときのように、パッチに含めるファイルを選択できます。これで選択したファイルに対する、リポジトリを最後に更新したときからの変更点をまとめたファイルを得ることができます。

このダイアログの列は、変更をチェック の列と同じ方法でカスタマイズできます。詳細は 「こちらの状態とあちらの状態」 をご覧ください。

違うファイルの変更点を含めた分割したパッチも生成できます。もちろん、パッチファイルを生成してから、同じ ファイルに変更を加えて別のパッチを作成すると、2 つ目のパッチには 両方 の変更点が含まれることになります。

それでは、お好みのファイル名でファイルを保存してください。パッチファイルはお好みの拡張子でかまいませんが、.patch.diff を拡張子に使用するのが通例となっています。これでパッチファイルを送信する準備ができました。

また、ファイルに保存せずクリップボードに保存することもできます。電子メールに貼り付けて誰かにレビューしてもらう際に、そうしたくなると思います。また、1 つのマシンに 2 つ作業コピーがあり、片方からもう片方へ変更を持っていくときに、クリップボードにパッチがあるとべんりです。

パッチファイルの適用

作業コピーにパッチファイルを適用します。パッチを作成したフォルダと同じ階層で行う必要があります。よくわからなければ、パッチファイルの最初の行を見てください。たとえば、最初のファイルが doc/source/english/chapter1.xml に対するもので、パッチファイルの最初の行が Index: english/chapter1.xml なら、doc/source/ フォルダでパッチを適用する必要があります。適切な作業コピーを使用していても、適用するフォルダ階層が間違っていると、TortoiseSVN は適切な階層を使用するよう注意を促します。

パッチファイルを作業コピーに適用するために、少なくともリポジトリの読み込み権限が必要です。これは、他の開発者がリビジョンを変更していないかどうか、マージプログラムが参照するからです。

フォルダのコンテキストメニューから、TortoiseSVNパッチを適用... をクリックしてください。するとファイルを開く ダイアログボックスが現れ、適用するパッチファイルを選択できます。デフォルトでは .patch ファイルか .diff ファイルのみが表示されていますが、すべてのファイルを選択できます。あらかじめパッチをクリップボードに保存していれば、ファイルを開く ダイアログの クリップボードから開く... を使用できます。

その他には、パッチファイルが .patch.diff といった拡張子を持つ場合、直接そのファイルを右クリックして、TortoiseSVNパッチを適用... を選んでください。この場合、作業コピーの場所を入力することになります。

この 2 つは同じことを違う方法で行っているだけです。1 つ目は作業コピーを選択してからパッチファイルを閲覧し、2 つ目はパッチファイルを選択してから作業コピーを閲覧します。

一度パッチファイルや作業コピーの場所を選択すると、パッチファイルの変更を作業コピーにマージするように TortoiseMerge が起動します。小さなウィンドウに変更のあったファイルを表示するので、その中の項目をダブルクリックして変更の確認や、マージしたファイルの保存を行ってください。

他の開発者のパッチが適用されたので、今度は誰もがリポジトリから変更点にアクセスできるよう、コミットする必要があります。