コードレビューでコーディング規約違反ですと言われないためにgit hookでコミットするときに自動で直す

チームでコードレビューを実施する際に、コーディング規約違反ですというのを何十個もつけた事があって、これを不毛な作業だし、時間がもったいないという事で解決するのに以下の方法を実施しました。

  • gitのコミットフックを利用して、コミットする際にコーディング違反を自動修正する

コミットフックは、pre-commit(コミットする前に実行)とpost-commit(コミット後に実行)があるのですが、以下の理由でpost-commitを選びました。

  • 自分の書いたコードに対して、自動で変えられたものをコミットしたくない
  • どこが規約違反なのか認識したい

それでは設定の仕方を記します。

前提

  • pythonで開発
  • コーディング規約はPEP8
  • autopep8でコーディング規約を修正

手順

autopep8をインストールします。

$ pip install autopep8

まずリポジトリを作ります。

$ mkdir your_proj
$ cd your_proj
$ git init

次に、gitのpost-commitフックに使用するスクリプトを作成します。実行権限も付与する必要があります。

$ vi .git/hooks/post-commit
$ chmod 755 .git/hooks/post-commit

以下の内容を書き込みます

#!/usr/bin/env bash

PROJ_ROOT="$( git rev-parse --show-toplevel )"

${PROJ_ROOT}/hooks/scripts/post-commit
hook_status=$?
if test ${hook_status} -ne 0
then
    echo " git post-commit hook error"
    exit 1
fi

hookスクリプトを作成します。post-commit内に書くてもありますが、.git/hooks/post-commitの内容を変えたくなったときにいちいちメンバー全員に変更してもらうのはナンセンスなので、ソースコード自体にコミットしておきます。

$ mkdir -p hooks/scripts
$ vi hooks/scripts/post-commit
$ chmod 755 hooks/scripts/post-commit 

以下の内容にします。 --ignoreの部分はチームのコーディング規約の状況に応じてかえてください。

#!/usr/bin/env bash

FILES=$(git diff HEAD^ HEAD --name-only --diff-filter=ACM | grep -e '\.py$')

for f in ${FILES}
do
    # auto pep8 correction
    autopep8 --ignore=E309,E501,W291,E303 -i ${f}
done

hookスクリプトをコミットしておきます.

$ git add .
$ git commit -m'first commit'

準備ができたので何かコーディング規約に違反しているpythonスクリプトを作ります。 改行がありすぎたり、=(イコール)との間にスペースがなかったりします。

$ cat test.py 
print 'Hello World!'

def my_method():
    a=1+2


    return a



$

ただし正しく実行はできます。

$ python test.py 
Hello World!

それではコミットしてみます。

$ git add .
$ git commit -m'add test'

するとコミットした直後にもかかわらず変更点がでています。

coding_—_bash_—_bash.png

git diffでみてみると以下のようになります。

coding_—_lv_—_bash.png

commit後に自動で修正されているのがわかります。 これでさらにコミットしてpushすれば、もうコードレビューで規約違反ですと言われる事がなく、本質のレビューに集中できます。

今回はpost-commitにしますが、チームの状況に応じて、pre-commitにすれば、後からコミットしなくてもすみます。 何がPEP8違反なのかわかっているチームならpre-commitでもいいと思います。