😊

git hookに関するリサーチペーパーっぽい何か 2025年07月

に公開

要約

Gitでcommit前に定形のチェック処理などをはさみたい時に、Git hookという仕組みを使います。そのバリエーションについて記事にまとめておきます。

はじめに

この文章は、いわゆるリサーチペーパーっぽい何かです。現段階でGit hookに関する調べた情報をまとめて、どれを使うのかについての選択肢を広げる試みです。
ある程度知見がたまる度に文章は追加するつもりです。

この記事を書いた動機

2025-07-26にX(旧Twitter)で、Gitのコンプリクトについて話題になっていました。
手元で情報収集しているGit Hookをまとめて要件に応じてどのツールを使うのか判断する一助とするために書きました。

こうやってインターネットに置いておくと私の考慮不足があれば教えてもらえる可能性があるから。私の見えている部分はきっと狭い。

本文

Git hooks(Gitフック)とは何か?については参考文献1および2を参照してください。最低限の情報としては、あるGitコマンドを実行したときに、自動的に実行される仕組みです。

参考文献の事例だと、git commitの内容をチェックするpre-commit(後から出てくるpre-commitを管理するソフトウェアとは別です)と、コミットメッセージを事前につくるprepare-commit-msgフックや、コミットメッセージをlintするのにcommit-msgを使っています。(参考文献9および10)
git commit`コマンドは頻繁に使っているので、そこに対して自動化を思いつくひとが多いのでしょう。もちろん、Linux kernelに関わっているひとや、sourcehut - the hacker's forgeのようなメールベースでGitを使うひとはmail関係のフックを育てていることでしょう。

基本はGitリポジトリにある.git/hooks/配下のシェルスクリプトが使われます。
しかし参考文献3で言及している参考文献4のgit configで設定可能なcorehooksPathを使うと、一ヶ所で管理できます。環境変数も使えるので割と柔軟です。

最初はそれでいいか。と思っていたのですが、個々のGitリポジトリと、それぞれのリポジトリで使いたいフックが違うことに思いいたります。例えば、Gitでコンフリクトの発生していて解消せずにコミットするのは、どんなプログラミング言語、文書作成でも避けたい内容です。
しかし個々のGitリポジトリでコミットメッセージの統一する書式や使っているlintやツールが違っていると個々のリポジトリで独自設定をしたくなります。

ほとんどのひとは諦めて、GitリポジトリGit Hookをプロジェクトにあったフックをこれまでのプロジェクトで作った雛形から一部変えて毎回作ることになります。

現在は、コンテナで開発していることも多いので、pythonでかかれたpre-commitとというツール(参考文献5を参照)して、省力化しているでしょう。例として参考文献6を挙げておきます。

また別の切り口として、自分のよく知っているツールでフックの管理をしている場合もあります。私は最近、TypeScript/JavaScriptのランタイムDenoをよく使っているので、参考文献7の記事から、参考文献8のdeno hooksを知りました。

参考文献

  1. Git - Git フック
  2. githooks
  3. 未解決のコンフリクトを検知するgit-hooks(pre-commit)をすべてのリポジトリに適用する #Git - Qiita
  4. Git - git-config Documentation
    • corehooksPath

    By default Git will look for your hooks in the $GIT_DIR/hooks directory. Set this to different path, e.g. /etc/git/hooks, and Git will try to find your hooks in that directory, e.g. /etc/git/hooks/pre-receive instead of in $GIT_DIR/hooks/pre-receive.

  5. pre-commit
  6. 【Git hooks】pre-commitフック導入
  7. Denoでもgit hooksでlint-stagedする!deno.jsonc時代の開発テンプレート
  8. Yakiyo/deno_hooks: Husky inspired easy-to-use git hooks manager for deno
  9. commitlint の紹介 #Git - Qiita
  10. Git Hooks (commit-msg) でコミットメッセージの書式チェック #githooks - Qiita

さいごに

件名 日付
記事を書きはじめた日 2025-07-27
記事を公開した日 2025-07-27
記事を変更した日 ----------

上記は、この記事の鮮度を判断する一助のために書き手が載せたものです。

詳細な変更履歴は、
GitHub - yabuki/friendly-potato: zenn-contents
を参照してください。

記事に対するTypoの指摘などは、pull reqをしてもらえるとありがたいです。
受け入れるかどうかは、差分とPull reqの文章で判断いたします。






GitHubで編集を提案

Discussion