on 2014-12-09

git hooks

和其他版本控制系統一樣,當某些重要事件發生時,Git 有方法可以觸發自訂腳本。有兩組掛鉤(hooks):用戶端和伺服器端。用戶端掛鉤用於用戶端的操作,如提交和合併。伺服器端掛鉤用於 Git 伺服器端的操作,如接收被推送的提交。你可以為了各種不同的原因使用這些掛鉤,下面會講解其中一些。

git hooks 簡單的說就是在進行版本控管時可以再額外多做一些事

Refer - Git 客製化 - Git Hooks

在以前我們公司在前端開發上是用前輩大大寫好的 hook 做一些事 但前輩大大們陸續離開後, 架構又改了 新專案沒法用原有的 hook 所以只好跳進來寫 hook 了

可以用來幹嘛?

Client side

  • lint 檢查
  • coding style 檢查
  • 完善要推的 code
  • 做自動化測試

Server side

  • deploy code to production
  • auto build

打算用來幹嘛?

身為一隻前端攻城獅, 只要顧好 client side 就好了 預計完成

  • phpcs
  • jshint
  • image trans to png8 ?
  • multi-lang file check ?

Log

使用 pre-commit 在 commit 前檢查 使用 php 撰寫(基本上都可以指定用哪個程式語言寫 ex: php、ruby、python …)

#!/usr/bin/php
# first npm install -g jshint
# jshint

<?php
$error = false;
// $path = "~/miiitv_plus/";
$path = "";
exec("git diff --cached --name-only --diff-filter=ACM | grep '\.js'", $output_js, $return_var);
if (!empty($output_js))
{
    foreach ($output_js as $file) {
        $file_path = $path . $file;
        if (!empty(shell_exec("jshint " . $file_path . "")))
        {
            echo $file_path;
            echo "\n";
            echo "--------------------";
            echo "\n";
            echo shell_exec("jshint " . $file_path . "");
            echo "\n";
            echo "====================";
            $error = true;
        }
    }
}
# http://tedshd.logdown.com/posts/246406-php-install-phpcsphp-codesniffer
# phpcs
exec("git diff --cached --name-only --diff-filter=ACM | grep '\.php'", $output_php, $return_var);
if (!empty($output_php))
{
    foreach ($output_php as $file) {
        $file_path = $path . $file;
        if (!empty(shell_exec("phpcs " . $file_path . "")))
        {
            echo $file_path;
            echo "\n";
            echo "--------------------";
            echo "\n";
            echo shell_exec("phpcs " . $file_path . "");
            echo "\n";
            echo "====================";
            $error = true;
        }
    }
}
if ($error)
{
    exit(1);
}
else
{
    exit(0);
}
?>

不過使用 phpcs 會太悲催, 就跟用 jslint 一樣, 所以之後又請後端改成適合的 sniffer

Refer - hooks