daily dayflower

2008-02-28

Mercurial 勉強中 (1)

Mercurial の特徴

Mercurialでバージョン管理404 Not Found も参照のこと。

軽さだのなんだのはまだ実感するほど使いこなしていません。

MercurialSubversion (SVK) の違い

SubversionSVK を組み合わせると分散レポジトリ管理ができるようになりますが,それでもやっぱり感覚的に違う部分があるので図におこしてみました。

f:id:dayflower:20080228162324p:image:w320

  • Subversion (svn) の場合,checkout の際は指定したリビジョン(省略時は HEAD)のスナップショットを取得します
  • Subversion の場合,working copy の各サブフォルダに管理用フォルダとして .svn がおかれます
  • Mercurial の場合は,working copy 直下の .hg のみが管理用フォルダです
  • SVK については,あえて一般的と思われる local copy を作る方式を記載しました*1
    • mirror repository から直接 checkout する方法もあります(⇒ FAQ/svk ? CodeRepos::Share ? Trac )。この場合,ユーザの使用感としては svn を使う感覚で update / commit するだけですむようです*2 *3

Subversion (SVK) ユーザのための Mercurial

SCM はどのソフトウェアもだいたい同じようなコマンドラインをうけつけるようになっています。しかし hg には svn (svk) と異なるいくつかの注意すべき点があります。

ほか,似ているところ,違うところなど。

hg clone A B と cp -R A B はどう違うのか

hg clone の場合,レポジトリのコピー元に関する情報が記載されます。*6

% ( mkdir hello && cd hello && hg init )

% hg clone hello my-hello

% cd my-hello

% cat .hg/hgrc

[paths]
default = /home/dayflower/src/hello

ですので,hg push | pull | outgoing | incoming 等で対象となるレポジトリを省略した場合,コピー元(親)のレポジトリが対象となります。

% touch a.txt

% hg addremove
adding a.txt

% hg ci -m "a.txt を追加した"

% hg out    # ← 対象レポジトリを指定する必要がないことに注目

searching for changes
changeset:   1:b4c9e5d06c5f
tag:         tip
user:        dayflower
date:        Thu Feb 28 13:35:43 2008 +0900
summary:     a.txt を追加した

hg out(going) というのは,もし hg push した場合に,どの changeset が送信されるか調べるコマンドです。反対に hg pull する前に使うと便利な hg in(coming) というコマンドもあります。ま,それは本筋の話ではなくて,default path が適切に設定されていると,hg push 等する際に,対象を指定する必要がないよ,ということです(svk と同じですね)。


また,hg clone の場合 cp -R と違って,同じファイルシステムレポジトリが存在する際にレポジトリ内の履歴ファイルはハードリンクになります。

% ls -li .hg/store/data/
total 4
231234 -rw-r--r-- 1 dayflower  users   64 Feb 28 10:00 a.txt.i

% ls -li ../hello/.hg/store/data/
total 4
231234 -rw-r--r-- 1 dayflower  users   64 Feb 28 10:00 a.txt.i

くわしくは hg help clone を参照してください。

*1:図では簡略化して書いてありますが,実際には Mirrored Master や Local copy はローカルマシン上に Subversion レポジトリを構成してそこに入れ込んであるイメージです。ほか色々ややこしい説明は ⇒ svk によるレポジトリ分割の作業記録 - daily dayflower

*2:なので上の図はちょっと不公平ですよね

*3:でも分散…というかミラーリングすることの旨味が減るような

*4:少なくともわたしにとって

*5プロパティとかどうなるのかまだ検証していません

*6:実はこのように一段 clone するだけだと clone 元の default path と同じになるので cp -R したときと等価になります。しかし複数段 clone した場合には直 clone 元が default path になるという違いがでてきます。