分散バージョン管理とは何か

This entry was posted by on Thursday, 16 February, 2006
>svk は使ったことがありません。 subversion はむかしは個人的に使っていましたが、 Berkeley-DB のバックエンドがいまひとついけていない感でした。fsfs がメインになったころには subversion をメインでは使っていなくて、いまは darcs をちまちま使っています。いや、まあ、 sourceforge.jp のレポジトリは CVS ですが。どうせ趣味なんで何を使っても可。 > >話が逸れたけど、それで、掲題の話です。「分散バージョン管理? 何だか知らんけどそんな大規模開発っぽい話なんて関係ないじゃん?」という人(昔のおれとか)は案外多いんじゃないかと思うわけです。でもそうじゃなくて、分散バージョン管理というのは個人レベルでも案外と嬉しいのじゃぜ、という話をここでは展開しようかと思います。 > >「バージョン管理」というのは、プログラムのソースコードとか、あと個人的には自分のドキュメントを管理したりとかしていますが、そういうことをするツールです。バージョン管理は、チェックイン・チェックアウトモデルというモデルが使われています。これは、どこかにバージョンを管理してくれる保管庫(レポジトリという)が存在しているという前提があります。使うときには保管庫からまず取り出して(チェックアウト)、たとえば変更を行い、変更後のデータをレポジトリに書き戻す(チェックイン)という流れになります。レポジトリではファイルの変更履歴などが保存されており、最新版の変更がまずかったから少し前のものをチェックアウトしてチェックインする、といったことができるわけです。 > >非常に古典的なバージョン管理システムが RCS で、これは作業ディレクトリの下の RCS ディレクトリがレポジトリになっています。 RCS はファイル単位のバージョン管理を支援するので、設定ファイルとかの管理ならともかくふつうのプロジェクトは使いづらい。そこで RCS をラップしていろいろな機能を追加し、複数ファイルをまとめて扱うシステムが登場します。これが CVS でした。 > >CVS にはいろいろ問題があったので、その後継としていろいろなシステムが登場していますが、そのうちひとつが subversion です。 subversion は非常にシンプルなモデルを提供しています。 CVS の問題のひとつとして、 RCS をラップしているためディレクトリを扱えない、という問題がありました。subversion はディレクトリを扱うことができます。おそらくそのため、 subversion のレポジトリは擬似的なバージョン管理機構つきのファイルシステムのような体裁になっています。そこで「ブランチ」という処理も、バージョン管理システム上にディレクトリを分けることで実現しています。 > >ちょっと話が逸れましたが、分散バージョン管理でした。そもそも何が分散しているのかというと、レポジトリが分散しています。もともとのバージョン管理システムでは、レポジトリからデータをチェックアウトして、チェックインするというモデルでしたから、レポジトリは本質的には1つしかありません。仮に同じようなデータを保持するレポジトリが2つあったとしても、両者を関連づける機能がありませんでした。逆に言えば、複数のレポジトリを関連づけ、まとめるのが分散バージョン管理というわけです。 > >複数のレポジトリを関連づけるというのはどういうことかというと、特定の変更と同じものをほかのレポジトリに渡したり、あるいは受け取ったり、というやりとりが可能だということです。たとえばブランチを作りたいとします。上でも述べたように subversion では、あるレポジトリの上でディレクトリを分けることでブランチを表現していました。分散バージョン管理では、レポジトリそのものを2つに分けてしまえばブランチになります。どちらもふつうにバージョン管理でき、もし一方の変更(バグフィクスとか)をもう一方に伝えたければ、レポジトリ間で変更を送ればよろしい。モデルとして、非常にシンプルではないでしょうか。 > >もっとしょーもない例を考えましょう。私はよくあるのですが、手元のノートPCで、数日以上にわたる大改造を行います。作業途中でコミットするわけにはいきません。ぜんぜんコンパイルが通らないコードがレポジトリの最新版になってしまいます。で、作業の途中で往々にして「今の3時間の作業は失敗だったからやっぱその前に戻したい」と思ったりするわけですが、コミットしていないわけですからもう無理ですね。こういうとき、手元のちょっとした変更用のレポジトリを、全体用と別に持ってると気が楽です。つまり、レポジトリを分散させたいわけです。 > >分散バージョン管理では、手元でどんどんコミットしていって、ある程度ちゃんとした改造が完了したところで、みんながダウンロードするときに使うレポジトリにそこまでの変更を丸投げすればオッケーなわけです。これは、けっこうキラクな世界ではないかと思います。 >

Comments are closed.