LoginSignup
5
6

More than 5 years have passed since last update.

gitでcommitするファイルの構文チェックをする

Last updated at Posted at 2017-03-09

git pushした後にjenkinsさんに怒られるより、
git commitで簡易チェックしたほうが良くない?のお話。

git hook

文字通り、commitをhookします

★参考にさせて頂きました。
Git hooks まとめ
http://qiita.com/khlizard/items/dfe1ec9d82c0ed5da7c6

pre-commitに動かしたい処理を書けば、commit直前に実行できる。

pre-commitファイルを作る
$ cd {PATH_TO_PROJECT_GIT}/.git/hooks
$ cp -p pre-commit.sample pre-commit

pre-commit

commitするファイルを対象に、構文チェックします

★参考にさせて頂きました。
エラーのあるファイルはコミットしない(git編)
http://sotarok.hatenablog.com/entry/20090223/1235363846

★(余談)Gitのpre-commit.sampleにある4b825dc642cb6eb9a060e54bf8d69288fbee4904とは?
http://qiita.com/fieldville/items/5518ed98ce38eb9df351

pre-commitを編集して、実行権限を付与して、git commitします

$ vi pre-commit

#!/usr/bin/php
<?php

$output = array();
$return = 0;

//直近のcommit hashタグを取得する
exec('git rev-parse --verify HEAD 2> /dev/null', $output, $return);
$against = $return == 0 ? 'HEAD' : '4b825dc642cb6eb9a060e54bf8d69288fbee4904';

//stagingにいる修正ファイル名を取得する
exec("git diff-index --cached --name-only {$against}", $output);

$filename_pattern = '/\.php$/';
$exit_status = 0;

foreach ($output as $file) {
    if (!preg_match($filename_pattern, $file)) {
        // don't check files that aren't PHP
        continue;
    }

    $lint_output = array();

    //構文をチェックする
    exec("php -l " . escapeshellarg($file), $lint_output, $return);
    if ($return == 0) {
        continue;
    }
    echo implode("\n", $lint_output), "\n";
    $exit_status = 1;
}

exit($exit_status);

$ chmod -x pre-commit

「構文をチェックする」のところをしたいコマンドに変えれば、なんでもチェックできますね。

エラーがあると?
$ git add {任意のファイル群}
$ git commit -m "pre-commitテスト"
-- 構文チェックの内容 --

commitが完了しません!

5
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
6