Mercurialではじめる分散構成管理

第1回 「分散」への第一歩 ~ ローカルでの複製

この記事を読むのに必要な時間:およそ 6 分

複製方法あれこれ

一番簡単なリポジトリの複製方法は,複製元リポジトリを指定して"hg clone"を実行することです。

コマンド13

% ls -F
myrepo/
% hg clone myrepo myrepo2
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
% ls -F
myrepo/   myrepo2/
% 

別な複製方法として,他のリポジトリから"hg pull"により構成管理情報を取り込む方法があります。ただし,"hg pull"の実行に先立って,取り込み先リポジトリを初期化しておく必要があります。

コマンド14

% hg init myrepo3
% ls -F
myrepo/   myrepo2/  myrepo3/
% cd myrepo3
% hg pull ../myrepo
pulling from ../myrepo
requesting all changes
adding changesets
adding manifests
adding file changes
added 1 changesets with 1 changes to 1 files
(run 'hg update' to get a working copy)
% 

察しの良い方は「pullがあるなら~」と,薄々予想されていることと思いますが, 予想通り"hg push"によって構成管理情報を「送りつける」ことでの複製もできます。

コマンド15

% hg init myrepo4
% ls -F
myrepo/   myrepo2/  myrepo3/  myrepo4/
% cd myrepo
% hg push ../myrepo4
pushing to ../myrepo4
searching for changes
adding changesets
adding manifests
adding file changes
added 1 changesets with 1 changes to 1 files
% 

各リポジトリにおいて"hg log"出力を確認することで,それぞれがmyrepoの複製であることを確認できる筈です。

ちなみに,"hg init"で初期化したてのリポジトリに対して"hg pull"/"hg push"により複製を行った場合,ワーキングディレクトリは空のままです。最新の成果を反映させる場合は"hg update"を実行してください。

「分散」「自動伝播」

リポジトリの複製ができたところで,早速myrepoに移動して変更作業をしてみましょう。

コマンド16

% cd myrepo
% echo 'good morning' > morning.txt
% hg add morning.txt
% hg commit -m 'add morning'
% hg log
changeset:   1:b85af333a085
tag:         tip
user:        fujiwara
date:        Mon May 05 21:57:35 2008 +0900
summary:     add morning

changeset:   0:a044b949325f
user:        fujiwara
date:        Mon May 05 21:16:24 2008 +0900
summary:     add hello.txt

% 

"hg commit"によりmyrepoで変更を確定したなら,myrepoから複製した他のリポジトリに移動して,"hg log"出力を確認してみてください。

"hg clone","hg pull"のいずれで複製したリポジトリに対しても,複製元であるmyrepoでの最新の"hg commit"結果(上記例での"b85af333a085")が反映されていないことがお分かりでしょう。逆方向(⁠⁠複製先」「複製元⁠⁠)の反映に関しても同様です。

「分散」などという大仰な形容が付くと,個々が自立的に連携して云々といった,いかにも複雑なものを思い浮かべる方も居ることでしょう。しかし,ことMercurial における「分散」に関しては,⁠複数のリポジトリが存在し得る」⁠各リポジトリは独立して機能することができる」という程度の意味しか無いのです。何の設定も無しに,各リポジトリ間で構成管理情報が自動的に伝播することはありません。

さて,myrepoおよびmyrepoの3つの複製で,それぞれ異なる変更内容を"hg commit"により確定したと仮定します。その際の各リポジトリが保持する構成管理情報を模式的に表すと,以下のようになります。

図2 成果の分散

図2 成果の分散

矩形内の数字は各リポジトリごとのリビジョン番号を,矩形の色はそのチェンジセットがcommitされたリポジトリを表しています。リビジョン番号が同じでも,色=commitされたリポジトリが異なれば,そのチェンジセットは異なるものと考えてください。

この状況はまさに,複数の開発者のそれぞれが,自分のリポジトリにおいて作業を行った状況に相当します。

次回は,上記のように分散した状態にある成果の,集約ならびに統合について説明したいと思います。

著者プロフィール

藤原克則(ふじわらかつのり)

Mercurial三昧の日々が嵩じて, いつの間にやら『入門Mercurial Linux/Windows対応』を上梓。凝り性なのが災いして,年がら年中アップアップな一介の実装屋。最近は仕事の縁が元で,OpenSolarisに入れ込む毎日。