darcsとhg
おひさであります。
ここ最近、日記も書かずに何をしていたかというと、まあちょこちょこ遊んだりしているわけですが、それ以外だとたとえば先週(thanksgivingの休日)にはヨセミテ国立公園に行ったりしていた。晩秋のヨセミテは水が少なく滝が涸れておりけっこう残念だったのだが(やはり旬は春から初夏なのだろう)、それでもそこかしこにある巨岩とか絶壁の風景は壮絶で、面白かったりしたのである。
で、はなしをコンピュータ系に移すと(ちなみに戻ってこない)、ふとさいきん hg もいいかな、という気がしていて hg を試用中。まあまあである。 hg (Mercurial) というのは、 python で書かれた軽量な分散バージョン管理システムである。各方面で「スジがいい」と評判のアレだ。
それで、 hg とかを軽く使ってみたり、いろいろ見ていて思ったのだが、 git もそうだけど、 darcs とは根本的なパラダイムが違うのだよね。 hg とか git とかでは、ファイルの更新があるとそれぞれの「バージョン」が別ファイルとして存在するようなイメージなわけだ。現実的にはもっとマシなことをいろいろしているんだろうけど、非常にシンプルなイメージとしては「各ファイルごとに全バージョンを圧縮かけて適当な名前で持っている」モノをレポジトリと呼んでる状態。ほかからパッチが飛んでくると、新しいバージョンのファイルをそのレポジトリにつっこむってな感じ。
darcs はパッチが主体で、ファイルは非常にうつろいやすい。レポジトリには各パッチごとにべつべつのファイルになってて、適当な名前で持ってる状態になってる。ほかからパッチが飛んでくると、それを単に保存するだけ。
で、このちがいが何をもたらすかというとだ。
darcs はパッチが主体なので、最新版はかりにレポジトリに保存しておくとしても、ちょっと前のデータでも取り出すのはけっこうしんどい。パッチを逆に充てていったりしないといけないからだ。 hg とか git なら、適当な手段で探したいバージョンのファイル名さえわかれば、あとはすぐだ。
逆に darcs はすごく奇妙なことができて、途中のパッチを「抜く」ことができる。ある最新版の状態から、「あのとき、あのパッチを受け入れてなかったらどーなっていたか」みたいなバージョンをつくりだすことができるのだ。それまで一度も存在したことがなかった「過去ありえたかもしれない」バージョンを取り出す。
これはたとえばそうだな、開発版的な変更にそれらしい名前をつけておいて、チェックアウトのときに開発版用のパッチを省けば安定板がチェックアウトできる、っていうことである。
とはいえモノはいいようで、そうそう簡単にはいかないのだけど。なぜかというと、あるパッチが追加した行を変更すると、パッチの間に依存関係が生じるからである。そういうわけでいろいろややこしくて、パラダイムとしては面白いわりにそんなに利便性が高まっているかというと謎だけど、そういう怪しいことができるのは darcs の面白さだ。
hg とか git とかは、同じ分散バージョン管理といってもそういうところが少し違う雰囲気である。 darcs はパッチ管理だけど、ほかのはやっぱりふつうにバージョン管理なんだねえ、なんて思ったりした。
しかしまあ、そういう違いこそあれ hg もよくできている。何がよくできているかといって、ほかのソフトのレポジトリを変換できるのである。これが cvs とか subversion 程度なら驚きはしないが darcs2hg なんてのがあるのである。相当、意識はしているのだろう(もしくはよっぽどヒマなんだろう)。まあ、 darcs にもひそかに GitRepo というモジュールがあるからねー。
ただ、 hg で手元からリモートに push するっつー利用形態のばあい、そのあとでわざわざリモートマシンに入って update しなきゃいかんのはどうにかならないのかなあ?
pushしたあとリモート側のワーキングファイルは更新されていませんが、リポジトリは更新されてるので、updateする必要はないと思います。
いや、単に最新版のファイルも使ってるんですよ。
それに、ふつうのファイルとして見たいですし、そのディレクトリに .hg しかないというのは個人的には好きではなくて……
git と同じ動きなんですね、> hg。
http://git.or.cz/gitwiki/GitFaq#head-b96f48bc9c925074be9f95c0fce69bcece5f6e73
git ですみません。ご参考まで。