post-receive-email を使って、push 時にメールを飛ばす
今まで自作で作った微妙なメール送信スクリプトを使ってたんですが、post-receive-email というものがあると知って、hollyなblog:git post-receive-email を参考に、こっちに移行しました。
これだとソースの diff がメールで見れないけど、commit 時にもメールを飛ばすようにしてるし、そこでは diff 見れるから OK ということで。
環境は下記とします。
- メール送信スクリプト:/usr/local/src/git-1.6.5.7/contrib/hooks/post-receive-email
- 共有リポジトリ:/var/git/sendmail.git
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 する ###