はむはむエンジニアぶろぐ

このブログのコンセプトは"ハッキングの為なら愛する家族を傷つけることをいとわない" 自分にとってエンジニアリングは "手段ではなく生きる目的" である

git hookを使ってデバッグコードをコミットできないようにする

f:id:secret_hamuhamu:20150405195300p:plain
Gitを使っていて、間違えてデバッグコードをコミットしてしまったことはありませんか?
デバッグコードを取り除いてコミットし直すの面倒くさいですよね。
git log も汚れますし、デバッグコードがある状態にチェックアウトできてしまうという状態が健全ではないです。
git rebase するのも状況によっては、難しかったりします。

じゃあ、どうやってデバッグコードをコミットしないように担保するのか?
git diff ?
人がチェックするには、キツイですね。
面倒なことは、機械にやらせましょう。

git hookというものを使って、デバッグコードをコミットできないようにします。

動作環境

  • git version 2.3.8 (Apple Git-58)

git hookとは?

Git フック
コミットだったりpushされるタイミングで、任意のスクリプトを実行できるというものです。
フック処理というやつです。

スクリプトは、RubyやPythonなど動作する言語ならなんでもいいようですが、どのマシンにもインストールされているだろう言語が好ましいですね。
.git内のhooksディレクトリに、スクリプトを格納していきます。
suffixに.sampleと付いているので、取り除いて使用します。

$ tree .git/hooks
.git/hooks
├── applypatch-msg.sample
├── commit-msg.sample
├── post-update.sample
├── pre-applypatch.sample
├── pre-commit.sample
├── pre-push.sample
├── pre-rebase.sample
├── prepare-commit-msg.sample
└── update.sample

今回は、コミット直前にスクリプトを実行したいのでpre-commitに、デバッグコードを検知するスクリプトを記述します。

pre-commitで、デバッグコードをコミットできないようにする

pre-commitという、ファイルを作成します。
今回は、コミット対象のPHPファイルに echovar_dump が、あればコミットできないようにします。
サンプルコードを貼って置きますので、よしなに改良して使ってください。

#!/bin/sh

IS_ERROR=0
# コミットされるファイルのうち、.phpで終わるもの
for FILE in $(git diff-index --name-status HEAD | grep -E '^[AUM].*\.php$' | cut -c3-); do
    result=$(grep -EHn 'echo|var_dump' $FILE)

    # マッチした行があれば0
    if [ $? -eq 0 ]; then
        echo "Can't commit the Debugging Cord : $result"
        IS_ERROR=1
    fi

done

exit $IS_ERROR

Gistにも上げておきます。 PHPのデバッグコードっぽいコードをコミットできないようにするpre-commit
では、デバッグコードをコミットできなくなっているか確認してみましょう。

$ git status

On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        new file:   echo.php
        new file:   safe.php
        new file:   var_dump.php

echo.phpvar_dump.php にデバッグコードが混じっています。
では、コミットしてみましょう。

$ git commit

Can't commit the Debugging Cord : echo.php:2:echo 'ほげほげ';
Can't commit the Debugging Cord : var_dump.php:2:var_dump($array);

echo.php:2:echo 'ほげほげ';
var_dump.php:2:var_dump($array);

ちゃんと、デバッグコードを検出できていますね!(^o^)

おすすめの本

開発効率をUPする Git逆引き入門

開発効率をUPする Git逆引き入門

  • 作者: 松下雅和,船ヶ山慶,平木聡,土橋林太郎,三上丈晴
  • 出版社/メーカー: シーアンドアール研究所
  • 発売日: 2014/04/09
  • メディア: 単行本(ソフトカバー)
  • この商品を含むブログ (6件) を見る

チーム開発実践入門 ~共同作業を円滑に行うツール・メソッド (WEB+DB PRESS plus)

チーム開発実践入門 ~共同作業を円滑に行うツール・メソッド (WEB+DB PRESS plus)

Web制作者のためのGitHubの教科書 チームの効率を最大化する共同開発ツール

Web制作者のためのGitHubの教科書 チームの効率を最大化する共同開発ツール

GitHub実践入門 ~Pull Requestによる開発の変革 (WEB+DB PRESS plus)

GitHub実践入門 ~Pull Requestによる開発の変革 (WEB+DB PRESS plus)