post-receive-email を使って、push 時にメールを飛ばす

今まで自作で作った微妙なメール送信スクリプトを使ってたんですが、post-receive-email というものがあると知って、hollyなblog:git post-receive-email を参考に、こっちに移行しました。
これだとソースの diff がメールで見れないけど、commit 時にもメールを飛ばすようにしてるし、そこでは diff 見れるから OK ということで。

環境は下記とします。

post-receive の準備

まず、コミット後に実行されるスクリプト(post-receive)を準備します。post-receive は hooks の下に post-receive.sample という形であるので、コピーして使います。

cd /var/git/sendmail.git/hooks
cp post-receive.sample post-receive

post-receive を編集

次にpost-receive の中身を編集します。post-receive-email のパスがコメントアウトしてあると思うので、コメントアウトを外して、パスを変更します。

### これを↓ ###
#. /usr/share/doc/git-core/contrib/hooks/post-receive-email
### こうする↓ ###
. /usr/local/src/git-1.6.5.7/contrib/hooks/post-receive-email


メールが文字化けすることがあるので、文字コードの設定をしておきます。これは、post-receive-email を修正します。

### 197 行目あたりに追加
MIME-Version: 1.0
Content-Type: text/plain; charset="utf-8"

### 684 行目あたりを編集
generate_email $oldrev $newrev $refname | nkf -w80 | send_mail

git config をいじる

このままだと、メールの送信先が設定されないので、git config で設定します。ついでに、prefix と差出人も設定しておきます。
複数共有リポジトリを作ったときに毎回設定するのが面倒なので、今回は global で設定しました。

git config --global hooks.mailinglist "XXXXXX@gmail.com"
git config --global hooks.emailprefix "[git commit]"
git config --global hooks.envelopesender "XXXXXX@gmail.com"

description を編集

もう一点。私は description の存在を知らなかったので、メールが飛ぶと「UNNAMED PROJECT」とかでちゃってました。
description は、/var/git/sendmail.git/description というファイルで、ここにプロジェクト名を設定できるみたいです。(post-receive-email を読んだら、description の設定がなかったら UNNAMED ... になるみたいでした。)
UNNAME は格好悪いので、description を編集。これでメールのタイトルや本文に UNNAMED ... が出なくなります。

#### 編集内容これだけ↓ ###
sendmail_repo

hooks 用の共有リポジトリを作成

複数共有リポジトリがあると、それぞれに hooks の設定をしなきゃいけないのがめんどくさかったので、hooks のリポジトリをつくってしまうことにしました。

共有リポジトリを作成してコピーします。
これで今後共有リポジトリを作成したら、hooks を hooks.git から clone して使うようにすればOK です。

cd /var/git
git init --bare hooks.git
### clone して sendmail.git の hooks たちをコピー ###
git clone hooks.git
cp -rp /var/git/sendmail.git/hooks/* /var/git/hooks
### git commit して git push する ###