wiki:MercurialGroupWork

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)