lefthook
Git hooks(pre-commit等)を管理するツール。このリポジトリでもnotesのfrontmatter(created/updated)自動付与のために導入している(後述)。
概要
- 開発元は Evil Martians(Rails周りで有名なコンサル企業)。Go製で、単一の依存フリーバイナリとして配布される。
- Ruby gem、npm、Go、Python、Swift、Homebrew、各種Linuxパッケージマネージャー(deb/rpm/apk/pacman)、Wingetなど、多様なパッケージマネージャー経由でインストールできる。
- ライセンスはMIT。GitHub star数は8.6k程度(2026-08時点)。
- 公式サイトのキャッチコピーは “Fast. Powerful. Simple.” の3語。
主な特徴
- 設定はYAML1枚: リポジトリルートの
lefthook.ymlにhook名(pre-commit,commit-msg,pre-pushなど)ごとにコマンドを書く。 - 並列実行: 複数のジョブ(lintやtestなど)を並列で走らせて高速化できる。
- glob/ファイルフィルタ:
glob: "*.rb"のように、変更されたファイルの種類ごとにコマンドを分けて実行できる。ステージされたファイルのみ({staged_files})、変更ファイル全体({all_files})などをプレースホルダで渡せる。 - Docker対応: コマンドをDockerコンテナ内で実行することも可能。
- 単一バイナリ: Node.jsやRubyのランタイムに依存しない(Huskyのようにnpmパッケージとして入れることもできるが、本体はGo製バイナリ)。
Huskyなど類似ツールとの違い
- npmエコシステム限定のHuskyと違い、言語非依存で使える。
pre-commit(Pythonのpre-commit framework)と比較されることが多いが、lefthookは設定がYAML1枚で完結し、並列実行やDocker実行など「速度」寄りの機能を前面に出しているのが特徴。
このリポジトリでの使い方
mise.tomlでバージョン固定して導入している。
[tools]
lefthook = "2.1.10"
mise install
mise exec -- lefthook install
lefthook.ymlの設定:
pre-commit:
commands:
notes-dates:
glob: "notes/src/*.md"
run: perl update-note-dates.pl {staged_files}
notes/src/*.mdがステージされたときだけupdate-note-dates.plを実行し、以下を行っている。
- 新規ノートなら
created/updated、既存ノートならupdatedのみをYAML frontmatterに書き込む。 regen-index.plを実行してHTMLを再生成。- 生成物(
notes/,index.html,talks/index.html)をgit addしてコミットに含める。
ファイルのmtimeには依存せず、frontmatter自体を正として日付を管理している。新規clone時やCI環境ではmtimeが信用できない(checkout時刻になってしまう)ため、この設計にしている。