世界を動かす技術を、日本語で。

Prek: Rustで開発された、より良く、より速い、ドロップインのプレコミット置き換えツール

2026年2月4日原文(github.com)

概要

prek は、 pre-commit の高速・依存レスな代替ツール。 Rust製で、 単一バイナリ ・多言語対応・ディスク効率化を実現。 CPythonFastAPI などの有名プロジェクトでも導入実績。 pre-commit 設定やフックと高い互換性を維持。 多彩なインストール方法と、 monorepo や各種言語ツールチェーンへの対応が特徴。

prekとは何か

  • pre-commit の再設計版としてRustで開発されたフック実行フレームワーク
  • PythonやNode.jsなど、多言語で書かれたフックの実行・依存管理を自動化
  • 高速動作依存レスディスク効率化 を重視した設計
  • pre-commit の設定・フックと互換性を持つドロップイン代替
  • monorepo(ワークスペースモード) 対応
  • uv との連携によるPython仮想環境・依存管理
  • Python, Node.js, Bun, Go, Rust, Rubyなどのツールチェーンをフック間で共有
  • 一部フックはRustネイティブ実装で更なる高速化

主な特徴

  • 単一バイナリ で動作、Pythonや他のランタイム不要
  • pre-commit よりも数倍高速、ディスク消費も約半分
  • オフライン・即時利用 可能なbuiltinフックサポート
  • フック・リポジトリの並列クローン・インストール・実行 で全体の効率向上
  • Python仮想環境 作成・依存インストールの高速化(uv利用)
  • 直感的なコマンド拡張 (--directory, --last-commit, 複数フック同時実行など)
  • フック一覧表示自動アップデート 機能
  • シェル補完 によるコマンド入力支援
  • サプライチェーン攻撃対策 (auto-update時の--cooldown-days等)

インストール方法一覧

  • スタンドアロンインストーラー (Linux/macOS/Windows対応)

    • curl/powershellによるワンライナー
  • PyPI (pip, uv, pipxでインストール可能)

  • Homebrew

  • mise

  • cargo-binstall (Rustユーザー向け)

  • Cargo (ソースからビルド、Rust 1.89+必須)

  • npmjs (Node.jsパッケージとして、npm/pnpm/bun対応)

  • Nix/Nixpkgs

  • conda-forge

  • Scoop (Windows用)

  • MacPorts

  • GitHub Releases (バイナリ直接ダウンロード)

  • GitHub Actions (CI/CD統合用)

    • 例: j178/prek-action, taiki-e/install-action

導入・使い方

  • 既存プロジェクトで pre-commit からの移行はクイックスタートガイド参照
  • 新規導入時は設定ファイル作成、フック実行、git hookインストールの流れ
  • prek run コマンドで柔軟なフック実行が可能

他ツールとの違い・優位点

  • pre-commit よりも高速・効率的な環境構築とフック実行
  • フックごとの環境を共有 することでディスク消費・インストール時間を削減
  • 並列処理 による全体パフォーマンス向上
  • uv による高速なPython仮想環境管理
  • Rustネイティブフック で更なる高速化
  • repo: builtin によるオフラインフック対応
  • monorepo でのサブプロジェクト個別設定サポート
  • 使いやすさ向上 のためのコマンド・補完機能・一覧表示

導入実績・利用プロジェクト

  • CPython
  • Apache Airflow
  • FastAPI
  • Typer
  • Ruff
  • OpenClaw
  • Home Assistant
  • OpenLineage
  • Authlib
  • Django Project
  • Requests-Cache
  • python-attrs
  • Apache Iceberg
  • Lucene
  • msgspec
  • humanize
  • MoonshotAI/kimi-cli
  • simple-icons
  • ast-grep
  • commitizen
  • cocoindex
  • cachix/devenv など

謝辞

  • pre-commit のオリジナル開発者・コントリビューターへの感謝
  • Astralチーム (特にuvプロジェクト)からの多大な技術的学び
  • Rustでの効率的・イディオマティックな実装手法の参考

prek は、次世代のフック実行基盤として注目されており、今後もさらなる対応言語や機能拡張が期待されるツール。 pre-commit ユーザーや高速・効率化を求める開発現場におすすめ。

Hackerたちの意見

gitフックの価値がよくわからないんだよね。オプトインで、簡単にオプトアウトできる方法でシェルスクリプトを呼び出すって感じかな。強制的に実行させることはできないし、CI/CDとの統合もイマイチだし。直接シェルスクリプトを呼び出せばいいんじゃない?CI/CDプラットフォームでどう使うの?

価値があるのは、プッシュする前にローカルで失敗することがわかることだね。エージェントにも人間にも役立つ。

俺は逆のやり方をすることが多いかな。CIのステップで定義されたものをpre-commitに追加する感じ。いくつかのツールは既存の設定があるし、ローカルモードも使える。確かに人に強制することはできないけど、CIが失敗するから時間を節約できるよ。

明らかにバイパスできるけど、precommitフックを使ってローカルでスクリプトを実行して、特定のチェックが通るか確認することで、パイプラインでの失敗を防げるから、時間とお金を節約できるよ。組織の観点からすると、開発者体験の一部としてそれを義務付けることもできるね。(うちのチームは使ってないけど、潜在的な価値はわかる)

pre-receiveフックが好きなんだ。

コミット中以外にも、pre-commit/prekはrunで全てのフックを実行できるよ。だからCI/CDでは、すべての個別のlint/formatツールの呼び出しをpre-commit/prekへの一回の呼び出しに置き換えられる。例えば、https://github.com/python/cpython/blob/main/.github/workflow....

CIではよく使われてるよね。pre-commitやprek用の専用GitHubアクションもあるけど、たいていの人は普通にprek run --all-filesとかpre-commit run --all-filesを使ってリントCIジョブを実行してる。prekのドキュメントには、CPythonやFastAPIみたいな大きなプロジェクトが使ってるリストが載ってるよ。もっと詳しく見たいなら、各リンクはCIに統合した方法のPRだよ:https://prek.j178.dev/#who-is-using-prek

CIとよく統合されてるよ。CIでもローカルと同じフックを実行するから、DRYで、早めにフィードバックを得るためにローカルでもフックを使うようになる。CIなしのフックはあんまり役に立たないよ、常に壊れちゃうからね。

gitフックには価値があると思うけど、pre-commitは間違ったフックだね。これはコミットじゃなくて、プッシュを試みたときに実行されるフックにすべきだよ。

これは私の問題かもしれないけど、私はいつもgitの履歴を徹底的に操作してるから、gitフックが嫌いなんだ。コミットはミリ秒で終わるべきで、1分もかかるなんてありえない。

俺だけかな?pre-commitでパフォーマンスの問題に遭遇したことがないんだけど。確かにLinuxカーネルみたいな大きなプロジェクトには関わってないけど、不満はないよ。

pre-commitをあまり使ったことはないけど、たまに使うこともある。なんでこのプロジェクトが存在する必要があるのか全然わからないんだけど?pre-commitがパフォーマンスの問題を引き起こすことってあるの?フックされたプロセスが長くなることは理解できるけど、pre-commit自体は?なんで時間がかかるの?

Hacker Newsで議論の続きを見る