鏈接一:http://josephj.com/entry.php?id=346
鏈接二:http://hi.baidu.com/dingliang/item/bfe1c8b988db07422aebe3db
在前公司只要有人做了 CVS Commit,整個 RD Team 就會收到 Email,告訴你誰改了什麼東西。我當初是覺得這個功能超煩,因為在 Maling List 的 100 多人都會收到,也沒辦法分專案或 Function。所以對我來說絕大多數的 Email 都是沒幫助的垃圾信。可是每個人的想法不同,同事(匿名 haha XD)覺得他可以從這些信件學到很多。而反正我們才 6 個寫程式的、專案又單純,偶爾看看彼此的程式會蠻有趣的(「靠,你怎麼會這樣寫 」 XD)。又加上有個外包的需求得做掉。昨天晚上就花了點時間把git push 後會自動發信的功能給做上去了(我們不是用 github 而是自己有 Central Repository)。
安裝步驟
-
從 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=blobplain;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
在一般的情況下,你不需要修改此檔,大說可以用設定的方式解決。
-
修改 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
-
設定 post-receive 與 post-receive-email 為可執行
chmod a+x /var/git/repositories/foo.git/hooks/post-receive*
-
修改設定檔
要寄給哪些人、內容為何、信件標題 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" # 不只是變動的檔案列表,還有變動的內容
-
修改專案名稱
只有一行,請寫上你這個 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 = filegetcontents("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