第5章 ブランチとマージ

目次

ブランチ(分岐)
アーカイブの公開
マージの技法
tla replay
tla update
tla star-merge
パッチログの限界
マージの失敗が意味すること

さて、この章から先が GNU arch の本当の凄さが発揮されることに なる。ようやく私も一番話たいことについて語れる。ほとんど涙目になっ ている私の姿を想像してほしい。前章までの議論は CVS のような従来の システムでも本質的に同じこどかできる。ひとり、もっと正確には一つの リポジトリで作業している時には GNU arch の本当の性質は表には出ない。 それは単なる「また別の」バージョン管理システムでしかないのだ。そこ までの機能しか必要がないのであれば、GNU arch をわざわざ理解する必 要はあまりないと思う。なんで同じようなことを二つも三つも憶えなくて はならないのだろうと思うかも知れない。しかし、ネットワーク越しに、 別のリポジトリとの間でのやりとりが絡んでくると状況は一変する。

この章では、ネットワーク上の他のアーカイブバージョンの内容か ら分岐処理によって別のマシン上のアーカイブバージョンを作る方法と、 この逆に自分のローカルマシン上のアーカイブを他のマシンから分岐でき る形に公開する方法について示そうと思う。その後、リモートアーカイブ 間でのデータの同期方法について議論する。データの同期はマージと呼ば れるが、マージのために用意された GNU arch のコマンドのいくつかを紹 介する。マージに関する問題はモダンなバージョン管理システムすべてが 現時点で抱えているもっともホットなトピックの一つだ。GNU arch もま だこの問題を完全には解いていないが、かなり良い振舞をするいくつかの マージコマンドを持っている。おそらく今現在この世に存在しているまと もなバージョン管理システムの中では、最も良い結果をもたらすものの一 つだと言えるだろう。それでも時にはぶさまなことになる。マージの問題 をきれいに解くのは非常に難しい。人類でこの問題をきれいにといたもの はまだいない。もし君がこの問題を完全に解いたら、間違いなくチューリ ング賞がもらえる。万が一もらえないようなら、私が受賞会場に乱入して メガホン片手に君の名前を書いた垂れ幕を振りかざして暴れよう。約束す る。

この章を理解すれば、君は基本的に GNU arch について一定の理解 をしているということができるのではないかと思う。GNU arch コミュニ ティーには自分のアーカイブを公開している人がたくさんいるので、それ らのどれかを使って、この章での結果を是非自分で確認してみてほしい。 アーカイブサーバになるのには少し知識がいるが、人のアーカイブの分岐 を自分のマシン上に作るのは非常に簡単な作業で済むし、間違った操作に よって親のアーカイブを壊してしまうようなことは一切ないので安心して 試してみてほしい。

ブランチ(分岐)

いつものように君はインターネット上にある面白そうなソフトウェ アを検索しているとする。で、お目当てのものが見つかった。それはフリー ソフトウェアで自由に使ってよいことがわかった。実際にいじってみるが 実に申し分のない動作をする。すばらしい。ただ、すばらしい機能拡張を 思い付いた。どうしてもこの機能を実装してみたい。作者にメールして、 いきなり一緒に開発してくれないかと切り出すのもおかしな話だ。なにせ この人とは会ったこともない。これからだって会う機会があるとは思えな い。なにせ彼はアルゼンチンに住んでいるのだ。これじゃ地球の裏側では ないか。

こんな状況で、彼がもし自分のプログラムを GNU arch の公開アー カイブ上のバージョンとして管理していたとすれば、君は実に運がいい。 彼になんのことわりもなく、一切彼のてをわずらわせることはなく、君の コンピュータ上に彼のプログラムのコピーを作ることができる。それもた だのコピーじゃない。このコピーは自分の由来を理解している。自分のご 先祖様が誰であったかを記憶しているのだ。いまどきそんな話、人間でも あまり聞かなくなった。今後、彼が彼のアーカイブバージョンに加えた修 正点を追加で君のアーカイブに取り込みながら、君は君で自分の機能拡張 作業を続けることができるのだ。このような用途のために君が自分のアー カイブ上に作ったバージョンを、彼のバージョンの「分岐」あるいは「ブ ランチ」と言う。君のブランチは、彼のバージョンととても良く似ている。 でもほんのちょっとだけ違っている。君は拡張モジュールを作っているか らだ。君のアイディアは良いものかも知れないし、そうでもないかも知れ ない。こういうことは普通、少しコーディングを続けてみないとはっきり しないことが多い。本質的に試行錯誤的な作業になることがおおい。一ヵ 月夢中でハックしてみて、やっぱりうまくいかなかったとあきらめること になるかも知れない。でもそれが何だろう? 別に彼に何かを頼んだわけで はない。黙って君がギブアップすれば良いだけのはなしだ。逆にアイディ アが身を結び、君の機能はとても汎用的で、彼自身にも、そしてそのソフ トウェアを使っている誰にとっても有益なものだと確信したとする。そん な時には彼にメールして、自分のアーカイブ位置を伝え、ちょっと面白い ものを作ったから、よければ取り込んでもらえないだろうかと頼む。彼が 気に入れば、これを取り込むことができる。これをマージと言う。マージ は彼の意志だけでやることができる行為だ。君には関係がない。君がする ことは自分のアーカイブをインターネット上に公開するだけだ。彼に対し て特殊な設定をする必要は何もない。

CVS のような集中型システムではこうはいかない。分岐は、親のリ ポジトリと同じリポジトリ内にしか作ることができないからだ。もし今問 題になっているプログラムが彼のマシン上の CVS で管理されていたとし よう。分岐を作ることができるのは君のマシンではなく、彼のマシンだ。 ということは、まずは君は彼のマシンに対するアクセス権限を得る必要が ある。これは君の仕事ではない。彼の仕事だ。しかしこれは実におかしな 話だ。これからハックしようとするのは君だ。彼じゃない。なのにそのこ とで彼に作業が発生するのだ。これはおかしい。考えてもみてほしい。一 度も会ったことのない男からある日突然メールが来て、あなたのプログラ ムの分岐を作りたいから、あなたのマシン上にアクセス権限をくれと言う。 そんな人間においそれとアクセスを許すことができるだろうか?

百歩譲って、アクセス権限をくれたとしよう。くれた方はどんな気 持だろうか。これだけのことを自分にしてくれたのだから、ぜひとも何ら かの成果を出さなくてはならない。もちろんそんな義務はないのだが、あ る日突然気が変わってギブアップというわけにはいかない。理由を彼に説 明して、自分はこれこれこういう理由で拡張できると思って始めたけれど、 うまくいかなかった、残念だ、という話をしなくてはならない。しなくて はならないわけじゃないが、良識のある人間ならそうするだろう。こんな ことをしなくてはならないと思うと、じつに憂鬱だ。どうなるか分からな いことを勝手に始めるのに、誰だって他人を巻き込みたくなんかないだろ う。で、結局良いアイディアがひらめいても、そこまでして分岐を作る気 にはならないだろう。これは重大な機会の損失だ。可能性は小さいかも知 れないがもし成功していたとすれば、君だけじゃない、そのソフトウェア を利用しているすべての人にとっての損失だ。君は私が何か多げさなこと を言っていると思うだろうか? 私はそうは思わない。

GNU arch ならこんな心配は何もしなくていい。君は勝手に始めら れる。そして勝手に辞められる。うまくいけば彼に伝える自由がある。も ちろんそうしない自由もある。彼は彼で君の申し出を受け入れる自由も拒 否する自由もある。誰も困らない。みんなトクをする。実際この仕組みで 損をする人がいるとしたらいったいそれは誰だろう。私に教えてほしい。

GNU arch で人のアーカイブバージョンの分岐を作るには特殊な設 定は何も要らない。まず、彼のアーカイブを登録する:

$ tla register-archive tez@kamihira.com--2004s \
      http://arch.bluegate.org/{archives}/tez@kamihira.com--2004s
$

分岐元のアーカイブバージョンを tez@kamihira.com--2004s/hello--world--1.0 とし、分岐先のバージョン を octopus@bluegate.org--2004/hello--world--1.1 として説明すると、まず 分岐先アーカイブバージョンを作成する:

$ tla archive-setup hello--world--1.1
…
$

注意

分岐元のバージョン名と分岐先のバージョン名の間にはなん の制約もない。ふたつのバージョンが別のアーカイブに存在してい る場合であれば、まったく同一の名前にすることすら可能だ。今の場合 であれば、tez@kamihira.com--2004s/hello--world--1.0 を foo@bleugate.org--2004/hello--world--1.0 なるバージョンに分岐する こともできる。また、octopus@bluegate.org--2004/non--sense--0.1 のよ うな名前に分岐することもできる。あとから混乱しないように自由にバー ジョン名を選択してほしい。

そして tla tag コマンドで実際に分岐バージョンを作る:

$ tla tag tez@kamihira.com--2004s/hello--world--1.0 \
          octopus@bluegate.org--2004/hello--world--1.1
…
$

注意

tla tag コマンドを実行すると、XXX のような警告が出るこ とがある。これは分岐元のアーカイブがサインつきアーカイブであること に関係している。詳しくはXXXのサインつきアーカイブを読んでほしい。

これで終りだ。本当にこれで全部なのだ。嘘じゃない。私を信じて ほしい。あとは君の hello--world--1.1 のプロジェクトツリー上で思う 存分ハックするだけだ。君がハックしている最中に、彼は彼で自分のリビ ジョンを進めることができる。こうして少しずつ君と彼のアーカイブバー ジョンはずれていく。彼とのずれをなくして同期させるには、君は彼の追 加修正分を時分のアーカイブバージョンに取り込まなくてはならない。こ れがマージだが、3節で詳しく説明する。分岐元のバージョンと、分岐先 のバージョンは明示的にマージコマンドを発行するまで独立に修正を加え ることができる。この間両者にはデータの授受は一切発生しない。たとえ ばGNU arch がバックグラウンドでお互いのバージョンから作ったプロジェ クトツリーに加えた変更点をリアルタイムに検出して、もう一方の関連し たリモートアーカイブバージョンに情報を転送したりすることはない。 GNU arch が実際データを交換するのは、XXX のマージコマンドのどれか を実行したときだけだ。だからどちらかのマシンがラップトップパソコン で、分岐後、マシンをネットワークから外して、喫茶店で作業を続けても もちろんなんの問題も発生しない。マージしたくなったときにネットワー クにつながっているだけで十分なのだ。