この記事は、元の場所 http://blogs.collab.net/subversion/do-not-post-mer から許可を得てミラーリングされています。無効なリンクは削除または更新されています。
著者: C. Michael Pilato
投稿日時 2008-03-29
多くの人にとって、来たる Subversion 1.5 リリースは「マージトラッキングといくつかの追加機能」のようなものとして認識されています。新しいマージトラッキング機能に投入された作業が、他の個々の分野への投資を上回っているのはおそらく事実でしょう。しかしもちろん、Subversion 1.5 はマージトラッキングだけではありません。このリリースには、他にもいくつかの主要な機能があります。そして、ご想像のとおり、Subversion コミュニティは過去1年半にわたって無数のバグ修正も行ってきました。しかし今日は、バグ修正と機能の両方の側面を持つ、見過ごされてしまったかもしれない点について簡単に説明したいと思います。それは、外部リポジトリからのマージです。
Subversion は、しばらく前から、マージ元が1つのリポジトリにあり、ターゲットの作業コピー(マージ*先*)が別の(「外部」)リポジトリからのものである場合に、マージ操作を実行することを—ある程度—許可していました。結局のところ、Subversion はマージを本質的に diff の適用としてモデル化しているため、diff のソースはそれほど重要ではないと考えるかもしれません。しかし、これは誰も実際に話題にしない機能です。Subversion のパブリック APIには記載されていません。Subversion ブックには記載されていません。Subversion のリリースノートにも自慢げに書かれていません。実際、私がこの機能の存在を知っていた唯一の理由は、Subversion のマージトラッキング機能をハッキングしているときに遭遇したコードコメント 때문입니다。なぜ秘密のベールに包まれているのでしょうか?おそらく、これは意図せずに実装された機能の1つ—具体的には動作するようには意図されていなかったが、ほとんどの場合動作していた機能—なのかもしれません。あるいは、それが時々しか動作しなかったことが理由かもしれません。いずれにせよ、外部リポジトリからのマージは事実上隠された機能です。
どうやら「これはうまくいくはずだ」という精神に突き動かされたのか、openCollabNet コミュニティのメンバーがこの機能を見つけ、*そして*その欠点を見つけました。ユーザー「argeman」は、マージトラッキングベータプログラムフォーラムに次のように投稿しました。
svn 1.5 alpha2 を少しテストしました(いくつかのリポジトリを変換して、それらで遊んでみました)。今のところ完全にうまくいきます。まだ動作しない唯一のこと(以前の Subversion リリースでは動作しませんでした):別のリポジトリからの変更をマージしようとすると、追加されたファイルでは機能しません。
私は自分自身で外部リポジトリからのマージを試したことはありませんでしたが、この機能の価値をすぐに認識しました。それを2つの単語で要約できます。「ベンダーブランチ」。ベンダーブランチは、他の誰かのコードを逐一ミラーリングすることなく、プライベートなカスタマイズを維持するための一般的な方法です。これを実現するにはさまざまな方法があります。たとえば、特定のベンダーのリリースパッケージの内容を完全にミラーリングした個々のブランチを使用し、さらに、現在使用されているバージョンのベンダーパッケージとプライベートな変更を含む別のブランチを使用することができます。純粋なベンダーリリース間の差分をカスタマイズしたコピーに適用することで、カスタマイズしたパッケージをアップグレードします。あるいは、バージョン管理ブランチにはベンダーパッケージのカスタマイズされたコピーのみを保持し、バージョン管理されていないベンダーパッケージの内容間の差分として生成されたパッチを使用して、そのブランチをアップグレードすることもできます。そして、一部のマゾヒストはバージョン管理の力を完全に避け、ベンダーのパッケージの新しいリリースごとに更新する必要があるカスタムパッチファイルを維持しています。(あなたがその一人なら、あなたの病気を治すのを手伝ってくれる人がいます。)
外部 Subversion リポジトリからマージする機能は、前述の最初の方法と2番目の方法に似た一種のハイブリッドアプローチを提供します。このアプローチでは、純粋なバージョンはベンダーの Subversion リポジトリから簡単に取得できるため、ベンダーのリリースの純粋なミラーも追跡する代わりに、ベンダーのパッケージのカスタマイズされたコピーのみを維持する必要があります。しかし、 अब आप 面倒なパッチファイルを扱う代わりに、バージョン管理ツールを使用して、それらの純粋なバージョン間の違いをカスタマイズしたコピーにマージできます。
残念ながら、「argeman」は「ねえ、この機能を見つけました。素晴らしいです!」と言うために投稿したのではありませんでした。投稿は、この機能には可能性があるが、マージの結果として追加する必要があるファイルの処理に失敗したことを伝えるためのものでした。しかし、これがオープンソースソフトウェアで作業することの喜びです。Subversion のコードを変更して問題を修正し、回帰テストを作成するのにわずか40分かかりました。さらにその後、関連するフォローアップ修正を行うのに少し時間がかかりました。そのため、Subversion 1.5 がリリースされる頃には、外部リポジトリからのマージが、リポジトリ内マージと同じ基本レベルでサポートされることを期待しています。マージ元の名前変更は、Subversion で常に発生していたのと同じ問題を引き起こし、外部リポジトリからマージする際にはマージトラッキングロジックはバイパスされますが、最も一般的な状況ではマージは正常に完了するはずです。
C. Michael Pilato は、Subversion のコア開発者であり、「Subversion を使用したバージョン管理」(O'Reilly Media)の共著者であり、ViewVC の主要なメンテナーです。彼は、CollabNet のソフトウェアエンジニアとして、ノースカロライナ州の自宅からリモートで作業しており、2001年初頭から活発なオープンソース開発者です。マイクは、旅行、サッカー、家族と過ごす時間、そしてそれらの組み合わせが大好きな、誇り高き夫であり父親でもあります。彼はまた、作曲や演奏も楽しんでおり、ロックスターになるという密かな願望を抱いています。マイクは、ノースカロライナ大学シャーロット校でコンピューターサイエンスと数学の学位を取得しています。