My blog

Add intelligent tagline here

git–bareをmercurialで

文書とか雑多な資料を複数台のPCで共有するために、今までsubversionを使っていたのだけど、これから移動時間が長くなってきたので、移動途中でcommitできないのがちょっと問題。

というわけで、分散管理システムなmercurialを使おうと思ったんだけど、問題が一つ。ノートPCで作業を行い、続きをデスクトップPCで行おうとした場合、ノートでデスクトップにpushしなければならない。でも、変更を行う時にはどのPCで続きを行うかなんて知らないわけで。というわけで、共有レポジトリをサーバ上に立てておいて、そいつに変更したPCからpushして、作業の続きをしたいPCでpullすればいいわけです。しかし、サーバにpush下後は、サーバでupdateしないとレポジトリに反映されないわけで。

gitでは、git init –bare とすることで、 bare repositoryを作成することができる。 bare repositoryとは、それ自体にチェックアウトしたファイルを持っていないレポジトリであり、他の人がpushした後にupdateする必要がなくなる。だから、今回の用途にあっている。

複数人が触る公開レポジトリを作るときは、通常bare repositoryを作るみたい。<span class=”term”> そうしないと、誰かがpushした後にupdateをしなければならないからかな。

で、これをmercurialではどうやるのかなーと調べてみたところ、bare repositoryという仕組みはないらしい。その代わり、hookを使って同じことを実現するらしい。(<a href=”http://mercurial.selenic.com/wiki/FAQ#FAQ.2BAC8-CommonProblems.Any_way_to_.27hg_push.27_and_have_an_automatic_.27hg_update.27_on_the_remote_server.3F”>FAQ</a>参照)

.hg/hgrcに

[hooks]
changegroup = hg update >&2

と書いておけば、自動的にupdateしてくれる。ローカルにファイルを持つわけで、正確にはgitのbare repositoryとは違うのかもしれないけど、共有レポジトリとして使えるようになるわけだ。

ちなみに、 “>&2” と stderr に出しているのは stdout がデータストリームとして使われるからとのこと。

え、git使えばいいじゃん?いや、先輩がgit使ってたから、じゃあおれはmercurial~って思って。