Mercurialでグループ開発
最近、Mercurialを使い始めてます。 分散SCMやらMercurial自体の優位については他の人に譲りますが、確かに便利ですね。
ところが、グループで開発をしようとして、とたんにひっかかりました。 「hg push」を行ったら、Pythonなエラーがわらわらーっと出ました。 よく見ると、最後に大事なことが書いてあります。
remote: adding changesets remote: abort: Permission denied: /home/dokoka/.hg/store/00changelog.i
あちゃー。ありがち。 それってちゃんとやってくれるのかと思ったら、そうじゃないのね。 ファイルにいきなり書き込みしようとして、他の人がオーナでエラーになったってわけ。
「chgrp -R g+w .」と、ディレクトリのグループにsビットを立てるのは、やってありました。 Subversionの場合は、これだけで大丈夫なんです。 どうやら、ファイルに書き込む場合、古いのを削除して新しく作り直すのでしょう。 ディレクトリが書き込み可能なら、人のファイルでも削除できるからね。
解決
hgコマンドの偽物を作って、umaskを002に設定してから本物を起動するようにする。
- /usr/local/bin/hg
-
#!/bin/sh for a in "$@"; do if [ "$a" = "serve" ]; then umask 002 fi done exec /usr/bin/hg "$@"
PATHの設定で、「/usr/local/bin」が「/usr/bin」よりも優先されるようにしてあるのが前提です。 そうじゃない場合は、「/usr/bin/hg」の名前を「/usr/bin/hg.orig」とかに変更する必要があります。
いちお、リモートからサーバ側として起動されたときだけumaskをいじるようにしてみた。引数の解釈はかなりテキトウ。 また、同じレポジトリにローカルでpushすると、これではうまくいかない。
めんどくさければ、こんなのでもだぶんOK。
- /usr/local/bin/hg
-
#!/bin/sh umask 002 exec /usr/bin/hg "$@"
こっちなら、ローカルでpushしてもだいじょうぶ。ただし、その他どんな影響があるのか、いまいち検証してありません。
(2008/7/7 - sgk)
