{ubiquitous,omnipresent,portable,mobile,scattered}-(my)home {remote,distributed}-house{hold,keep}ing 【要件】 環境に応じて初期化ファイルを用意するのは面倒だ。 特に .zsh{env,rc}, .vimrc, (.X{defaults,resources} なんかも) * 各ホストでの変更の一部(全部ではない)を中央のリポジトリに反映したい。 各ホストでは独自の発展をするもんだ。 サイトローカルな変更と汎用の変更、ホスト固有の変更くらいは 独立に管理したい。 * (主にバックアップの目的で)履歴も残しておきたい。 * 一度変更して make install する方式だと面倒過ぎる。 実運用しているホームディレクトリをじかに作業ディレクトリとして使いたい。 * ホストによらずに簡単に動かせるソフトウエアが必要。 * メールアドレス帳などのように 公開リポジトリには置けないファイルが少数ある。 * おそらく単純な分岐では済まない。 あちこちの版を相互にマージしたくなる。 どこでも使えそうなのは cvs だが pserver を必要とするし ディレクトリの増減もありそう。 そもそもマージ処理が面倒だろう。 mercurial, bazaar は python2.3, 2.4 が必要なので使えそうにない。 tla だとファイル名規則がうるさい。 ~ に直接作業ツリーを展開すると その下に作業ツリーを作る時に --nested オプションを要するなど後々面倒。 darcs のインストールには Haskell 処理系が必要になる。 これは致命的な問題のはずだったが静的リンクされたバイナリが用意されている。 部分的なマージにも適していそう。 これが最適かも知れない。とりあえずこれで行こう。 【課題】 * 運用規則 おそらくはこれが最大(中心?)の問題点。特に命名規則。混乱しないことを祈る。 * 秘匿情報の分離 多分、秘匿情報は管理対象外として構わない。 必要なら暗号化し、別リポジトリにでも分離しておくか。 ただ、間違って汎用の環境ファイル群のリポジトリに 含めてしまわないように注意して保守する必要があるだろう。 ホームディレクトリで darcs init してしまうので、 その下のディレクトリで間違って darcs add すると ホームのリポジトリに登録されてしまう。 サブディレクトリの無許可の add を防ぐような手立てが必要だろう。 【用法の検討】 簡単なのは ~ に get して利用する。 この用法のためには README をサブディレクトリに移動するべき。 でもなんか間違いがあるといやなので、暫くは、 適当なディレクトリ(~ ではない)に get し、 そこからさらに ~ に pull して利用する。 厭らしいことに geocities の web サーバには . で始まる名前のファイルを置けない。 のみならず README すら置けない。 こうなると名前を変更するか tarball にでもする必要がある。 しかも ~ に直接 get することもできない。 それどころか pull できるかどうかも心配。 まぁ、できるだろうが、同じ内容のリポジトリがあちこちに作成されることになる。 かなり危なっかしい気がする。 【用法】 既存のディレクトリ(~)に get はできないので、 代わりに init と pull を組み合わせる。 (0) darcs がインストールされているものとする。 必要なら などから取得する。 (i) tarball をとってきて展開する。 ~/omnihome.darcs としておく。 この中のファイルは原則として(何があっても)変更しない。 (i') サイトローカルなリポジトリを使いたい場合などは これをさらに公開リポジトリに get してそこから展開する。 (ii) ~ で darcs init (iii) ~ で darcs pull --repodir=. ~/omnihome.darcs (あるいは適当なリポジトリ) (i) から直接展開する場合は、念のため darcs push --disable するのがいいかもしれない。 対象ディレクトリが既に存在しているとエラーで終了してしまうので この対策を考える必要がある。 (iv) 必要な変更を加えるなど普通の darcs 生活をする。 (v) 時折、 ~/omnihome.darcs を更新し、 ~ で darcs pull する。 ただし、衝突が発生し得ることに注意。 汎用の変更がある場合は、対応するリポジトリ(の author)に対して darcs send する。 で、命名規則となるわけだが… 要因は? OS (Debian/Red Hat/Solaris/cygwin) Version/Release 場所 (Country/Site/Private) 環境 (Lang/Encoding) まぁ、ホスト名があれば大体の状況がわかる。 汎用なら generic サイト特定なら site-local といった札をつける。 【対象】 .bashrc 最小限 zsh 関連ファイルをどう配置するか。 4.2.5 では使えたけど 4.0.4 で使えなかった。 transientrprompt, VAR+=(v1 v2) .zshenv cygwin 用に ls に --show-control-chars か --quoting-style=literal オプションも渡す べきか? cygwin だと事前に無闇に多数の PATH 要素が設定されていた。 安易に上書きするとまずいか。 path は typeset -U して欲しい値を全部追加してしまう。 .zshrc kterm の TERMCAP の扱いは何なんだろう。 less Red Hat, Solaris の場合は日本語用に -r オプションをつける。 Debian の less は LANG の設定があれば -r オプションは不要。 .zsh/compctl zshcompsys は使わない想定。 lib/zshfunc/ これを ~ の下に直接配置するにはどう管理すればいいか? namedir, md くらいは欲しい。 あんまり変更しないんで別扱いで構わないかも。 .vimrc vim 関連 作業ファイルは ~/tmp,/tmp に作る。 NFS などでは遅いだろうから ~/tmp を外す方が良いかも。 【未設定】 対象にするべき? .a2ps/ a2psrc に -o - と -X EUC-JP くらい。 .cshrc .Xresources 追加する? .cvsrc diff -u update -P -d くらい。 cvs -f で無視できる。 .darcs/defaults に ALL author メールアドレス diff unified .emacs .xemacs/ .mew.el .mlterm/ .plan .screenrc .w3m/ .xsession 【補足/蛇足】 darcs pull -s --dry-run で取り込むパッチの一覧を darcs pull -v --dry-run で取り込むパッチの内容を確認できる。 darcs pull --dry-run では衝突は見つけられない。 でも --dry-run しない場合はファイルに衝突マーカーが書き込まれてしまう。 pull 前に darcs revert しておくくらいしか簡単な対処はなさそう。 また darcs unrecord, rollback は作業ディレクトリの変更点は取り消さない。 darcs pull --external-merge 'xxdiff -m -O -M %o %1 %a %2' で処理するとマージの成功・失敗に関係なく pull は完了する。 darcs pull --external-merge true なら全くマージせずに pull が完了するだろう。