[Git] 利用 post-receive hook 自動發 Email 給團隊成員

此篇文章最近更新時間為2010-12-31 01:02:35 目前共有2篇留言

關於作者 - JosephJ

任職於 Faria。喜好戶外運動、2008 年 5 月完成「跑步環島」。對於新技術跟程式碼有著強烈的偏執狂。

在前公司只要有人做了 CVS Commit,整個 RD Team 就會收到 Email,告訴你誰改了什麼東西。我當初是覺得這個功能超煩,因為在 Maling List 的 100 多人都會收到,也沒辦法分專案或 Function。所以對我來說絕大多數的 Email 都是沒幫助的垃圾信。可是每個人的想法不同,同事(匿名 haha XD)覺得他可以從這些信件學到很多。而反正我們才 6 個寫程式的、專案又單純,偶爾看看彼此的程式會蠻有趣的(「靠,你怎麼會這樣寫 」 XD)。又加上有個外包的需求得做掉。昨天晚上就花了點時間把 git push 後會自動發信的功能給做上去了(我們不是用 github 而是自己有 Central Repository)。

安裝步驟

  1. 從 git 下載 post-receive-email

    請先檢查你的 Server Repository 是否有 post-receive-email 這個 hook。通常比較新版的 Git 都已經在此位置 /usr/share/doc/git-core/contrib/hooks/post-receive-email,若沒有請到 http://git.kernel.org/?p=git/git.git;a=blob_plain;f=contrib/hooks/post-receive-email;h=60cbab65d3f8230be3041a13fac2fd9f9b3018d5;hb=HEAD下載。像我們的 Server Repository 是比較舊版的 Git,我就把上面的檔案直接抓到 hook 的目錄。

    curl "http://git.kernel.org/?p=git/git.git;a=blob_plain;f=contrib/hooks/post-receive-email;h=60cbab65d3f8230be3041a13fac2fd9f9b3018d5;hb=HEAD" > /var/git/repositories/foo.git/hooks/post-receive-email

    在一般的情況下,你不需要修改此檔,大說可以用設定的方式解決。

  2. 修改 post-receive

    注意 git 只會觸發 post-receive 這個 hook,並沒有 post-receive-email 的 hook 喔!你必須在 post-receive 內執行 post-receive-email。

    vim /var/git/repositories/foo.git/hooks/post-receive-email
    ==
    #!/bin/sh
    # An example hook script for the post-receive event
    ./post-receive-email
    
    
  3. 設定 post-receive 與 post-receive-email 為可執行

    chmod a+x /var/git/repositories/foo.git/hooks/post-receive*
  4. 修改設定檔

    要寄給哪些人、內容為何、信件標題 Prefix 都是透過設定檔,不用修改程式唷!

    vim /var/git/repositories/foo.git/config
    ===
    ...
    [hooks]
            mailinglist = "employ1@company.com, employ2@company.com" # 收件人列表
            envelopesender = git@company.com # 送件人 Email
            emailprefix = "[GIT] " # Email 標題開頭
            showrev = "git show -C %s; echo" # 不只是變動的檔案列表,還有變動的內容
    

  5. 修改專案名稱

    只有一行,請寫上你這個 Git 的專案名稱。

    vim /var/git/repositories/foo.git/description
    ===
    ProjectName
    

以上步驟都完成後,你從你自己的 repository 做 git push 到 server repository 就會寄信給大家啦!

自定一些功能

以上做完發現了一些缺點:我希望寄件者可以是 git push 的那個人、而不是寫在 config 中一成不便的 hooks.envelopesender。另外由於我們有 master 跟 develop 兩個 Branch,也需要有區隔。因此我就把 post-commit 用我熟悉的 PHP 改寫:

#!/usr/bin/php
<?php
// 取得目前的 branch 為何
$stdin = file_get_contents("php://stdin");
$stdin = rtrim($stdin, "\n");
$stdin = explode(" ", $stdin);
$refname = $stdin[2];
$is_dev  = (strpos($refname, "develop") !== FALSE) ? TRUE : FALSE;

// 將 envelopesender 改為 log 中最後一個  commit 的人
$cmd = ($is_dev ? "git log -b develop -1 --pretty=format:%ae HEAD" : "git log -1 --pretty=format:%ae HEAD");
exec($cmd, $sender);
$sender = $sender[0];
$cmd = exec("git config hooks.envelopesender $sender");

// 將 STDIN 導入倒 post-receive-email
$cmd = "echo \"$stdin[0] $stdin[1] $stdin[2]\" | " . dirname(__FILE__) . "/post-receive-email ";
exec($cmd);

exit(0);
?>

依然沒有動到下載的 post-commit-receive 就達成我的需求啦 :D



Comments

  1. josephj 2011-01-13 19:59:23
    能夠看賈克遜大大寫的 Code 是小的榮幸啊 = =+
    目前還沒有做這一塊啦 :p 只有 Angus 會收到 lib.git 的修改
  2. Jackson 2011-01-13 09:16:42
    是不是我push的code 你都会收到邮件了啊。。这个得小心点了。哈哈。
暱稱: 必填。
Email: 非必填。若填寫為不公開欄位,僅供站長參考聯繫。
內容: 必填。限 255 個字元以內。
驗證碼:
送出

Facebook Comment