Debian GNU/Linux で Git を Smart HTTP Transport で使うでHTTP経由で公開リポジトリを作ったとき、masterブランチへのgit pushを特定ユーザに絞りたい。そこで、非常に素朴ながら以下のようにした。
リポジトリが/var/git/repos.gitであるとき、/var/git/repos.git/hooks/updateとして以下のスクリプトを置く。
!#/usr/bin/ruby remoteUser = ENV["REMOTE_USER"] refname = ARGV[0] oldrev = ARGV[1] newrev = ARGV[2] if refname =~ /^refs\/heads\/master$/ unless remoteUser == 'USERNAME' p "You can't push for #{refname}" exit(1) end end
USERNAMEがmasterにpushできるユーザー。それ以外のユーザの場合はpushが失敗に終わるようになっている。