*

* SVN Index   * Tips   * Top

Subversion(TortoiseSVN)でマージする方法(手順)(3) [ベンダブランチ]

プログラムをすべて自分たちで(開発チーム内で)管理しているあいだはよいのですが、 プログラムがだんだん大規模化してきて、ライブラリの一部を別のチームや 別の会社に作ってもらって、そのソースコードを納入してもらう、 ということもあるでしょう。

よそへ頼んだものは、すぐに完成してもらうことができれば話は早いですが、 なかなかそうはいきません。リリースまでの間、複数回に分けて 作りかけのものを受け取って、 できるところからテストを進めなければならない場合もあります。

さらに、納品してもらうものが専用に注文したものならよいのですが、 汎用的な製品のソースコードで、 納入物の一部分を自分たちでアレンジしなければならないかもしれません。

こんなときに、ライブラリの次のバージョンが届いたときに、そこへ これまでに組み込んだ自分たちのアレンジを何とか効率よく反映させたいものです。

(ご注意) このページをご利用になった結果の影響については、 一切責任を負いませんので、あらかじめご了承願います。

  1. まず、外部からの納入ファイルの置き場所を決めます。 ここでは、リポジトリの最上位に「vendor/」等の名前のフォルダを作りましょう。 ここでは便宜的に「ベンダフォルダ」と呼ぶことにします。

  2. 外部から納入されるものは、納入物単位でフォルダを作っていきましょう。 例えば「テストライブラリ1」というものを外部へ注文して、 ソースコードを定期的受け取るように決めたとしましょう。 これらを入れるために、 ベンダフォルダ以下へ「libtest1/」というフォルダを作成します。

  3. さらに、受け取るファイルは1つではなく、バージョンアップが届くことを想定しています。 「libtest1/」以下へは、バージョンごとのフォルダを並べられるようにしておきます。 そして、現在使用中のファイルはここですよ という意味で、「current/」というフォルダを作成します。

  4. 納入されるソースコードは、 おそらく拡張子が zipであったり、tar.gzであったり、lzhであったりするかもしれません。 これを、いま作成した「current/」ディレクトリへ解凍します。

  5. 解凍できたら、「current/」以下をすべてまとめてコミットします。 まだ何もコミットしていない場合は、「vendor/」フォルダを 右ボタンで選択して、コンテキストメニューより[追加]を押して、 確認画面が出たら[OK]を押します。そのあと、忘れずにコミットしてください。 今回は例ですので、ファイルは3つだけです。

  6. 解凍した現在のファイル群は、これがバージョン1の納品物そのものですよ という意味で、「v1/」という名前でタグ付けしておきます。 「current」を右ボタンで選択して、コンテキストメニューより、 [TortoiseSVN] → [ブランチ/タグ]を押します。 [先URL]のところへは、「vendor/libtest1/v1」と入力してください。 リビジョンは特に理由がなければ最新にしておいてください。 準備ができたら、[OK]を押してください。

  7. 次に、納品物を自分たちのプログラムの一部として動作するようにします。 作成した「current/」を、 現在開発中の「trunk/」以下の必要な場所へブランチしてください。 先と同じように 「current」を右ボタンで選択して、コンテキストメニューより、 [TortoiseSVN] → [ブランチ/タグ]を押します。 今回の例で、「trunk/libtest1/(3つのファイル)」の構成で このライブラリを配置しようとしているのであれば、 [先URL]のところへは、「trunk/libtest1」と入力してください。 リビジョンは特に理由がなければ最新にしておいてください。 準備ができたら、[OK]を押してください。

  8. ブランチを作成したら、更新してローカルファイルを取得しておいてください。

  9. 準備はこれで完了です。このあと、「trunk/libtest1/」以下のファイルは、 必要に応じて自分たちの都合のよいようにアレンジしてください。 変更したら、コミットしてください。

  10. いくらかの時間が過ぎました。 新しいバージョンのテストライブラリ1が届きました。 届いたファイルは、現在の「vendor/libtest1/current/」以下へ解凍しなければなりません。 しかし、ここには以前のバージョンのライブラリが既に入っています。 バージョン1とバージョン2の間には履歴が何もないわけですから、 ファイルやフォルダが増えたり減ったりしたことは、もちろん誰も知りません。 この情報は誰か(といっても、あなたしかいません)が Subversionへ教えてあげなければなりません
    もっとも原始的な方法は、増えたり減ったりしたファイルやフォルダを 自分たちで洗い出して、それを右クリックメニューでひとつずつ設定していくことです。
    これではあまりにたいへんなので、current以下すべての「.svn/」以下のフォルダ以外の 通常のファイルをいったんすべて削除してしまって、 そのあと、もらった新しいファイルを解凍する方法が考えられるかもしれません。 この場合だと、解凍したあとに全く空になってしまっているディレクトリを 右クリックメニューで削除を選択する以外には、 コミットするときに「管理外」「紛失」のファイルにチェックをつけることで、 ファイルの追加と削除、フォルダの追加について対応できると思います(多分)。
    こんなときのために、Subversionには「svn_load_dirs.pl」なる支援ツールも入っています (TortoiseSVNには入っていませんので、Subversionのソースコードより入手してください)。 (1)ベースフォルダのURL「http://‥‥/vendor/libtest1」、 (2)ベースフォルダから見た解凍先の相対的なフォルダのURL「current」、 (3)インポートするフォルダ(ローカル)「(どこでもよいので新しいファイルを展開した場所)」 の3つの引数を渡すことで、ツールができる範囲内で自動的に処理してくれます。 ツールができないことは、ツールがユーザへ質問してきます。 スイッチ「-t」をつけて、1つめの引数のに「タグ名」を入れて合計引数を4つにすると、 タグ付けまでやってくれます。このプログラムを活用してもいいかもしれません。

  11. ここまで何とか、テストライブラリ1の新しく届いたものを 変更・追加・削除のセットができたとします。 確認できたら、コミットしてください。

  12. 変更したcurrentフォルダは、バージョン1のときと同じ要領で、 これがバージョン2の納品物そのものですよ という意味で、「v2/」という名前でタグ付けしておきます。 「current」を右ボタンで選択して、コンテキストメニューより、 [TortoiseSVN] → [ブランチ/タグ]を押します。 [先URL]のところへは、「vendor/libtest1/v2」と入力します。 リビジョンは特に理由がなければ最新にします。 準備ができたら、[OK]を押してください。

  13. ブランチを作成したら、更新してローカルファイルを取得しておいてください。 ここまでで、バージョン1とバージョン2との両方のタグができました。

  14. ここからは、いよいよ ベンダによってバージョン1からバージョン2へアップデートされた内容を、 自分たちのアレンジを損なうことなく、 自分たちのプログラムへ更新します

  15. ここで、ひとつ注意が必要です。自分たちがアレンジしたファイルを ベンダが消してしまったり、別のフォルダへ移動させてしまった場合です。 この場合は、マージの結果、編集したファイルそのものが失われてしまいます。 もし、 先の作業でファイルが移動されたことがわかり、かつ、 自分たちの編集も同じように移動させればよいというのであれば、 これからの作業をする前に、「trunk/libtest1」以下のファイルも ベンダが行ったことと同じように (Subversion上で)移動させておくと、 あとはSubversionがマージ作業をしてくれます。
    (ご注意) Subversion 1.5系列ではこの操作で問題はありませんでしたが、 Subversion 1.6.2を使って同じ操作を確認したところ、 ツリーコンフリクト(ツリーの競合)が発生して 通常のマージ作業ができませんでしたので注意が必要です。

  16. さて、アレンジ済みであろう「trunk/libtest1/」フォルダを 右ボタンで選択して、コンテキストメニューより [マージ]を選択します。 画面を表示したら「異なる2つのツリーをマージ」を選択して [次へ]を押してください。

  17. 今回は「v1」から「v2」へのアップデートですので、 マージ元は「vendor/libtest/v1」、マージ先は「vendor/libtest/v2」を 画面上へ入力してください。リビジョンは最新にしておいてください。 作業コピーのところは、「trunk/libtest」(右クリックしたところ)を表示しています。 準備ができたら、[次へ]を押してください。

  18. マージする深さを選択します。 「作業コピー」を選択した場合は、 作業コピーをチェックアウトしたときに選択した階層に依存します。 準備ができたら、[マージ]を押してください。

  19. もし、マージの途中でコンフリクトが発生した場合は解決させてください。 その場で解決しても、あとで解決しても、どちらでもよいです。

  20. マージが完了しますので、 正しくマージされていることを(プログラムの場合はきちんと動作することを) 確認してください。

  21. 確認できたら、忘れずにコミットしてください。


shacho@critical.ne.jp
Last modified: Thu May 21 18:00:00 JST 2009