執筆者: 終に鮭
最終更新: 2021/08/10
#ショート記事週間(そんなものはない)
皆さん、開発にGitは使ってますか?使ってない人、使いましょう。使っている人も、hookという機能を使ったことがありますか?今日はGit hookの紹介をします。
Git hookというのは、各種gitコマンドを実行する前後のタイミングにおいて実行されるシェルスクリプトのことです。
リポジトリの .git/hooks/
に特定の名前のシェルスクリプトを置くことで実行されます。これを利用すれば、例えばcommitする直前に署名のメールアドレスを確認したりできるようになります。
例:commitする直前にメールアドレスを確認する(pre-commit)
#!/bin/sh
# hookはデフォルトでは標準入力を受け取れないのでターミナルから入力をリダイレクトする
exec < /dev/tty
echo "The author of this commit is to be $(git config user.name) <$(git config user.email)>."
# readで入力待ちにする
echo -n 'Press any key to continue...'
read
この記事の内容はこれぐらいのカスカスな記事なんですが、書いたhookが「自分のスイッチを切る装置」並に無駄(ここでは労力に対しての作用が少ないという意味)だったので紹介します。
具体的には、ファイル名末尾(拡張子)が .pdf
.log
.aux
のいずれかがstagedであればそのままcommitするかどうかを尋ね、そのままcommitしない場合それを取り除いて(git restore --staged FILE
)commitするというスクリプトです。
#!/bin/bash
exec < /dev/tty
SECRET=$(git diff --name-only --staged | grep -e '.pdf$' -e '.log$' -e '.aux$')
if [ $? -eq 0 ]; then
echo 'Following files which should not be public are to be committed.'
echo -e "\e[31m${SECRET}\e[m"
echo -n 'Are you sure to commit them? [y/N]: '
read YN
case $YN in
[Yy]* ) exit 0 ;;
* ) ;;
esac
echo -n 'Do you want to omit them and commit? [Y/n]: '
read YN
case $YN in
[Nn]* ) echo 'Commit aborted.'
exit 1 ;;
* ) ;;
esac
git restore --staged $SECRET
fi
でもこれ、.gitignore
に *.pdf$
*.log$
*.aux$
を指定すれば終いなんですよね……case文の勉強になったしまあいいか……
この人が書いた記事