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 でレンタルサーバに反映させるとか。
グループで使う時にはちゃんと考えて運用しないと大変そうだけど。