MacPortsとhomebrewを微妙に併用していたが、新しく買ったMacBook Airでは完全にhomebrew一筋に切り替えようとしてみた。
homebrewのインストール(https://github.com/mxcl/homebrew/wiki/installation)に書いてある通りであり別にインストールは問題なく動作するのだがbrew updateを唱えた瞬間以下のようなエラーになる。
error: unable to unlink old '.gitignore' (Permission denied)
error: unable to unlink old 'README.md' (Permission denied)
fatal: Could not reset index file to revision 'FETCH_HEAD'.
rm: .git: Permission denied
Error: Failure while executing: rm -rf .git
homebrewはsudoを使わなくても動作する。MacPortsでは/opt/local
だったがhomebrewではデフォルトは/usr/local
にプログラムをインストールする。で、homebrewでは/usr/local
に対してstaff
グループの所有権を与えておき、
sudo dscl /Local/Default -append /Groups/staff GroupMembership $USER
によって実行ユーザをstaff
グループに追加しておくので、実行ユーザでは/usr/local
への書き込みはstaff
グループ権限によって行え、sudo
なしで実行できる。
じゃぁ、なんでパーミッションでおこられるのよと思って権限を調べてみると、/usr/local
がroot:wheel
権限になっていた。もともとhomebrewをインストールする前にこの状態になっているとhomebrewのインストールスクリプトでは/usr/local/bin
などはstaff
グループにしてくれるものの、/usr/local
の権限までは変更してくれない様子。それでインストール時に/usr/local
直下のファイル(.gitignore
とかREADME.md
とか.git
とか)は所有者がroot:wheel
のまま引き継がれたりしている。
というわけで実行ユーザで/usr/local/bin
への書き込みはできるのでbrew install
は動いたりするけど、/usr/local
直下のファイル(.git
)にアクセスできないのでbrew update
がこけると。
sudo chgrp staff /usr/local
でインストールしなおして、とりあえず解決した。仕組みをよく理解しないまま使うのはよくないと反省。