結論
-
git commit
コマンドを実行しようとする -
pre-commit
が実行される -
prepare-commit-msg
が実行される - コミットメッセージ入力ができるようになる
-
commit-msg
が実行される - コミットが実行される
-
post-commit
が実行される
はじめに
背景
Git Hookという便利な機能があるのに使いこなせなかった新卒情弱エンジニアはGit Hookを使ってみようと思った。
思いの外いろいろなところで処理を行うことができるのでここでまとめる。Gitの用語や使い方は猿でもわかるレベルでまとめられているのでその知識があると仮定してこの記事を書く。
そもそもGit Hookとは
Gitのアクションごとにクライアントサイドやサーバサイドでスクリプトを実行することができる。その機能のこと。
この記事の目的
Git Hook未経験者がどのタイミングでフックを実行できるのか知ることができる。
事前準備
以降の内容を実際に実行するため、新規に任意名のフォルダを作成し、その中でgit init
コマンドを実行する。すると任意名フォルダ/.git/hooks
が生成されているはずなので確認する(.git
フォルダは隠しフォルダのためls -a
で確認できる)
コミットワークフローフック
コミットワークフローフックには以下の4種類がある。
pre-commit
prepare-commit-msg
commit-msg
post-commit
echo
コマンドを用いてどのようなタイミングで発生しているのか確かめてみる。
まず、git add
、git commit
してメッセージを入力する際に:sh
してターミナルに戻った時の出力。
すでにprepare-commit-msg
まで進んでいることがわかる。次に、メッセージを入力してコミットした時の出力。
post-commit
まで進んでいる。では、実際のコミットはどの時点で行われているのだろうか。commit-msg
ファイルの末尾にexit 1
を追記して再度検証してみる。test.txt
をステージングに追加し、コミットメッセージを入力した後、git status
で状態を確認したものがこれ。
commit-msg
は行なっているにも関わらず、そこで1が返された結果コミットはされていないことがわかる。
最後にcommit-msg
ファイルの代わりにpost-commit
ファイルの末尾にexit 1
を追記(commit-msg
内のexit 1
は消去)してコミットした結果は以下。
きちんとコミットされていることがわかる。よってコミットの流れと各フックのタイミングは以下。
-
git commit
コマンドを実行しようとする -
pre-commit
が実行される -
prepare-commit-msg
が実行される - コミットメッセージ入力ができるようになる
-
commit-msg
が実行される - コミットが実行される
-
post-commit
が実行される