トップ画像
Git hookを書こう!

執筆者: 終に鮭

最終更新: 8/10/2021

#ショート記事週間(そんなものはない)
皆さん、開発にGitは使ってますか?使ってない人、使いましょう。使っている人も、hookという機能を使ったことがありますか?今日はGit hookの紹介をします。

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文の勉強になったしまあいいか……

取得に失敗しました

2020年度 入部

Twitter GitHub YouTube