2007年8月16日(木)

mercurial による孤立環境のファイル同期

試してみた。

Mercurial を選んだのは、別に python 萌えだからではなく以下に見るように野良 build の都合 (darcs のために Haskell の build からやってるわけにはいかん)

colinux をマスター環境、他に host A, host B があったとする。 どのホストも FW の遥か後方に位置していて互いに direct access はできない

  1. インストール
    1. colinux は root を握っているので適当にバイナリインストール
    2. host A, host B ではpython はインストール済みとする
      1. ソースを取得
      2. (make all して) make install-home すると、 ~/ 以下に実行ファイルと python モジュールがインストールされる
      3. モジュールのインストール先( ~/lib/python とか) を PYTHONPATH に追加する
  2. マスター側で登録
    ($HOME の dot file を CVS 管理しているので、これを hg でも二重に管理する)
    1. $HOME で hg init
    2. とりあえず、 .screenrc .zshenv .zshrc .zlogin .zlogout あたりを hg add
      ちなみに CVS リポジトリの方の最初の日付は 2002年7月22日。登録されてるファイルには .Xresources から .wl, .addresses, .folders はては .signature まで…
    3. hg commit
    4. (hg bundle できなかったので) hg export tip > H0
    5. この H0 を、境界ホストを通じてなんとか host A まで転送する
  3. host A での登録
    1. とりあえず tmp dir を作成しておいて、そこで hg init
    2. hg import H0
    3. .hg ディレクトリを ~/ に mv
    4. hg diff で確認すれば host A specific な修正が判るので適宜修正して hg commit
    5. これを host B に反映させるべく抽出する。 hg log で revision 番号を確認して hg export rev > H1
      (import する時のことを考えて、適当に分割して commit/export すること)
    6. この H1 を境界ホストを通じてなんとか host B まで転送
  4. host B での登録
    1. H0 を境界ホストを通じてなんとか host B に転送
    2. host A と同様に、 hg init して H0 と H1 を import
    3. .hg を ~/ に mv
    4. hg diff しててきとうに修正して hg commit
    5. 修正分を hg export rev > H2 してこいつをなんとか host A まで転送
  5. host A で merge
    1. hg import する
  6. マスター環境に戻る
    1. H1 および H2 を hg import すれば、 host A, host B の差分を取り込める
    2. cvs commit して終了

注意
たとえば上の例では、 host A, host B では .zlogin/.zlogout はほとんど殺してあったりする。 なので host A で修正して commit する時は、こいつだけまず commit する。 export する時もこれだけの差分で抽出しておいて、 host B には持っていって適用するが、 マスター環境には持っていかない

しかし、やっぱり転送の部分が死ぬ程面倒だな〜。 文章で書くと簡単なんだが、一々 scp して、 host によっては ssh-agent が効かなかったり DNS 逆引きの timeout 待ちされたり、そもそも DNS 引きそこなったり…
これに VPN まで加わったらやっぱり死ねる

そして、これ、差分/revision control の部分って結局人手でやってるんだよな〜。やっぱ破綻しそう…

[referer: [an error occurred while processing this directive]]

あわせて読みたい