##やりたいこと
コミットログにredmineのチケット番号(refs #XXX)が入っていないとコミットできないようにしたい。
→ client側のhookを強制的に設定したい。(主にpre-commit, commit-msg)
##手順
1 /.git/hooks/commit-msg
コミットメッセージのチェックを行うhookscriptのcommit-msgを使う。
commit-msg.sh
#!/bin/sh
exec 2>&1
function redmine_err() {
echo -e "\x1b[0;41m ERROR : please input tichet number..\x1b[0;49m";
echo -e " example : refs #[0-9]";
exit 1
}
/bin/grep "refs #[0-9]" $1 > /dev/null || redmine_err;
exit 0
##課題
あくまでclient側のhookなので、複数人で開発を行っている場合は各人でhookを設定しなければならない。
うーむ。。。面倒くさい。
打開策1
今回の開発ではソースのbuildを行う際にshellを叩くので、そこに一手間加える。
- gitの環境に.githooksという名前のディレクトリの下にhookscript(commit-msg, pre-commit)を登録しておく
- 下記のシェルスクリプト(setup.sh)も.githooksの配下に一緒に登録しておく。
- buildのシェルでsetup.shを叩いて.git/hooksに.githooks配下のスクリプトをシンボリックリンク。
setup.sh
#!/bin/sh
GITHOOK_DIR=.git/hooks
COMMITMSG=${GITHOOK_DIR}/commit-msg
PRECOMMIT=${GITHOOK_DIR}/pre-commit
git config --list |/bin/grep "commit.template" > /dev/null || \
git config --local commit.template .githooks/git_commit_msg_template
#シンボリックリンクを設定
if [ ! -f .git/hooks/commit-msg ]; then
echo "### Create symbolic linx ${COMMITMSG}"
ln -s ../../.githooks/commit-msg ${COMMITMSG}
fi
if [ ! -f ${PRECOMMIT} ]; then
echo "### Create symbolic linx ${PRECOMMIT}"
ln -s ../../.githooks/pre-commit ${PRECOMMIT}
fi
refs #
o
所感
結局client側のhookをcloneした段階で強制的に設定する方法はわからなかった。。
今回たまたまbuild時にshellを叩くようにしていたためclient側(cloneした人)の意思に関係なく設定できたが、完全解決とは言えないので調査続行中٩(’ω’)و init.templatedirを強制するとか。。
# あとperlとかruby、pythonとかでも書き直したい ♪(´ε` )