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

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

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

リポジトリの作成

プロジェクトの開始等で,新たにリポジトリを作成する場合は,"hg init"コマンドを使用します。

コマンド3

% hg init myrepo
%

以上で"myrepo"ディレクトリ配下がMercurialの構成管理対象になりました("myrepo"ディレクトリが存在しない場合は自動的に作成されます)⁠

「リポジトリの作成」と言っていたのに,⁠構成管理対象になった」とはどういうことだ?と思われるかもしれません。

Mercurialの「リポジトリ」は,⁠構成管理情報」の格納領域(CVS等ではサーバ側で管理される)と,構成管理対象ファイルの改変作業を行う「ワーキングディレクトリ」が,一体となったものを指します。言い換えれば,⁠リポジトリ」として作成したものであっても,構成管理情報の格納領域(".hg"ディレクトリ配下)を丸々削除してしまえば,それはもはや「リポジトリ」としては機能しません。

図1 リポジトリ構成図

図1 リポジトリ構成図

作成された「リポジトリ」は,すぐにでも「ワーキングディレクトリ」において編集作業を始めることができます。どうです? CVSやSubversionと比べて,非常に簡単なのではないでしょうか?

ちなみに,CVSのチュートリアル等にあるような,ある程度の成果物が既に存在する場合のリポジトリ作成は,以下の手順で行います。

コマンド4

% cd myproject
% hg init
% hg commit -A -m 'initial content'
adding dir1/dir2/dir3/night.txt
adding dir1/dir2/evening.txt
adding dir1/morning.txt
adding hello.txt
....
%

"hg commit"に対する"-A"オプションは,ワーキングディレクトリ中の全てのファイルを,自動的に構成管理対象に加えます。"'initial content'"部分はいわゆるコミットメッセージですから,各自で好きなように変更してください。

基本操作

Mercurialでは,先述したログ表示(log)と同様に,ワーキングディレクトリの状態表示(status)⁠特定時点との差分表示(diff)⁠構成管理対象への追加(add)⁠変更の確定(commit)といった基本機能は,CVSやSubversionと同名のサブコマンド実行により行うことができます。

コマンド5

% echo "hello" > hello.txt
% hg status
? hello.txt
% hg diff
% hg add hello.txt
% hg status
A hello.txt
% hg diff
diff -r 000000000000 hello.txt
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hello.txt	Mon May 05 21:15:32 2008 +0900
@@ -0,0 +1,1 @@
+hello
% hg commit -m 'add hello.txt'
% hg status
% hg diff
% 

紙面(磁性面?)の都合もありますので, 個々のコマンドの詳細に関しては, "hg helpコマンド名"で表示される Mercurialのオンラインヘルプで確認してください。 特に,"hg status"で表示される各ファイルの状態表示マーク ⁠"?"や"A")は重要ですので, "hg help status"は必ず確認しておくことをお勧めします。

Mercurialのオンラインヘルプ機能は, 利用可能なサブコマンドの一覧を"hg help"で表示することもできます。 いずれも英語表示ですが, CVSやSubversionの利用経験から構成管理の用語に馴染みがあれば, 比較的理解しやすいのではないでしょうか。

チェンジセット

MercurialはSubversionと同様に, 複数のファイルに対する一連の変更を一括して記録する, チェンジセット指向の構成管理ツールです。 通常の"hg log"では表示されませんが, "-v"付きで実行した場合には, 各チェンジセットで変更されたファイルの一覧も表示されます。

コマンド6

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

% hg log -v
changeset:   0:a044b949325f
tag:         tip
user:        fujiwara
date:        Mon May 05 21:16:24 2008 +0900
files:       hello.txt
description:
add hello.txt


% 

Mercurialはファイルのみを構成管理します(厳密には,⁠ファイルの内容を,パス名と共に管理する」と言えます)⁠ディレクトリの追加を指示する必要が無い一方で,空のディレクトリを扱えない,という点で,CVSやSubversionと異なります。

Mercurialで特定のチェンジセットを指す場合,通常は以下の3種類の値のいずれかを使用します。

  • リビジョン番号:"changeset:"値における(":")の左側
  • 12桁ハッシュ値:"changeset:"値における(":")の右側
  • 40桁ハッシュ値:"hg --debug log" 時のハッシュ値位置

先の"hg log"出力における最新のチェンジセットを指す場合,"0"でも"a044b949325f"でも指定可能です(通常の構成管理で40桁ハッシュ値を使う機会・必要性はあまり無いでしょう)⁠例えば,特定のチェンジセットに関する履歴だけを見たい場合は,"hg log -r 0"ないし"hg log -r a044b949325f"といったように使用します。

ちなみに,チェンジセットに与えられるハッシュ値は,変更内容+日時情報等の組み合わせから算出されるため,全く同じ内容・手順で"hg commit"に至ったとしても,同じ値が割り振られるとは限りませんので,本連載でのサンプル出力を参照する際には注意してください。

新しいツールやシステムを使い始める際に,何が不安かといえば,誤解や誤操作によって,それまでの諸々の作業に対して取り返しの付かない影響を与えるのではないか,というのが一番の不安なのではないでしょうか。

そこで,より分散リポジトリらしい内容に進む前に,まずは間違いを取り消す方法を説明しておこうと思います。

著者プロフィール

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

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