at posts/single.html

Mercurial で1人バージョン管理(複数マシンでの連携編)

作業中のディレクトリをそのまま気軽にバージョン管理できることが、1人だけでバージョン管理を使う時のメリットだと思っているけど、複数のマシンでリポジトリを同期させることももちろんできる。

「分散」リポジトリというだけあって、いろいろ機能がありそうだけど、とりあえず1人で使う時に必要なことだけを覚えた。

リポジトリのコピー

他のディレクトリやマシンからリポジトリを取得する。 Subversion での checkout に近いけど、 Mercurial はリポジトリ全体を丸ごとコピーするところが違う。 リポジトリが大きくなると時間かかりそうだけど、1人で使うレベルなら気にならないかな。 丸ごとコピーなので、コマンド名も clone になってる。 コピーしたいマシン上で clone コマンドを実行。 svn serve や CGI スクリプトで HTTP サーバを立てていれば、 SSH 以外に HTTP でも接続可能。 でも、 svn serve だと書き込みを許可するために設定がいるっぽい。

$ hg clone ssh://192.168.0.211/work/hgtest hgtest
requesting all changes
adding changesets
adding manifests
adding file changes
added 5 changesets with 7 changes to 3 files
3 files updated, 0 files merged, 0 files removed, 0 files unresolved

コピー元は path コマンドで確認できる。

$ hg path
default = ssh://192.168.0.211/work/hgtest

コピーした先でも自由に追加やコミットができる。 この時点ではコピー元のリポジトリへは反映されない。

$ vi test1.txt
$ hg commit -m 'text1.txt: update'
$ vi test2.txt
$ hg commit -m 'text2.txt: update'

現在のバージョン(チェンジセット)は tip コマンドで確認できる。 Subversion での trunk みたいなもの?

$ hg tip
changeset:   6:383b26fa4dc6
tag:         tip
user:        matsuoka@ubuntu2.localdomain
date:        Tue Mar 11 06:01:32 2008 +0900
summary:     text2.txt: update

コピー元との差分は outgoing コマンドで確認できる。 -p オプションを付ければ履歴も分かる。

$ hg outgoing -p
comparing with ssh://192.168.0.211/work/hgtest
searching for changes
changeset:   5:e0016f8b092c
user:        matsuoka@ubuntu2.localdomain
date:        Tue Mar 11 06:00:51 2008 +0900
summary:     test1.txt

diff -r 1735accccbf1 -r e0016f8b092c test1.txt
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/test1.txt Tue Mar 11 06:00:51 2008 +0900
@@ -0,0 +1,2 @@
+aaaa
+aa

changeset:   6:383b26fa4dc6
tag:         tip
user:        matsuoka@ubuntu2.localdomain
date:        Tue Mar 11 06:01:32 2008 +0900
summary:     text2.txt: update

diff -r e0016f8b092c -r 383b26fa4dc6 test2.txt
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/test2.txt Tue Mar 11 06:01:32 2008 +0900
@@ -0,0 +1,4 @@
+aaa
+aa
+aaaa
+

変更内容をコピー元に反映してよければ、 push コマンドを実行する。

$ hg push
pushing to ssh://192.168.0.211/work/hgtest
searching for changes
remote: adding changesets
remote: adding manifests
remote: adding file changes
remote: added 2 changesets with 2 changes to 2 files

変更内容を破棄したければ、コピー先のディレクトリを丸ごと消せば OK 。

まとめ

「分散」になると難しくなるかなーと思っていたけど、実は簡単だった。

  • svn checkout, svn commit の代わりに hg pull, hg push を使う
  • svn diff の代わりに hg outgoing -p を使う

1人で使う分にはこれで十分な感じ。 あぁ、これ、リモートの Web サイトの管理にも使えるなぁ。 ローカルでファイルを修正して、 hg pull でレンタルサーバに反映させるとか。

グループで使う時にはちゃんと考えて運用しないと大変そうだけど。

参考

関連する日記