Fragments of verbose memory

冗長な記憶の断片 - Web技術のメモをほぼ毎日更新

Feb 5, 2026 - 日記

シングルバイナリで完結するGit hooks: pre-commitからprekへの移行メモ

シングルバイナリで完結するGit hooks: pre-commitからprekへの移行メモ cover image

pre-commit を使っていて「Pythonプロジェクトじゃないのに、なぜPythonが必要なんだ」と思ったことはありませんか?

prek は、pre-commitをRustで再実装したGit hooks管理ツールです。既存の.pre-commit-config.yamlをそのまま使えて、Pythonランタイム不要、シングルバイナリで動作します。本記事では、prekの特徴と移行手順、そして「速さ」より重要な「ポータビリティ」について書きます。

pre-commitの本質的な課題

pre-commitは優れたツールですが、いくつかの課題があります:

  • Python必須 - Go/Rust/TypeScriptプロジェクトでもPython環境が必要
  • virtualenv管理 - プロジェクトのPythonバージョンと競合する可能性
  • CI/CDの複雑化 - setup-python + pip install pre-commit のステップが必要
  • オンボーディングの障壁 - 新メンバーがPython環境構築から始める必要

特に非Pythonプロジェクトでは、「Git hooksのためだけにPythonを入れる」という状況が発生します。

prekの特徴

prek (MIT License)は、これらの課題を解決します:

1. シングルバイナリ・依存ゼロ

1
2
3
4
5
# macOS/Linux
curl -LsSf https://github.com/j178/prek/releases/latest/download/prek-installer.sh | sh

# Windows
powershell -c "irm https://github.com/j178/prek/releases/latest/download/prek-installer.ps1 | iex"

Pythonランタイム不要。バイナリ1つで動作します。

2. pre-commit完全互換

既存の.pre-commit-config.yamlをそのまま使用可能:

1
2
3
4
5
6
repos:
  - repo: https://github.com/pre-commit/pre-commit-hooks
    rev: v6.0.0
    hooks:
      - id: trailing-whitespace
      - id: end-of-file-fixer

移行は pre-commit uninstall && prek install のみ。

3. 高速化

公式ベンチマーク(Apache Airflow):

操作pre-commitprek倍率
初回インストール187秒18秒10.2倍
フック実行352ms77ms4.6倍
ディスク使用量1.6GB810MB半分

ただし、これは「おまけ」です。本質的な価値は次のセクションで説明します。

ポータビリティの価値

Rustツールの真の価値は「速さ」ではなく「ポータビリティ」です。

CI/CDの簡素化

pre-commitの場合:

1
2
3
4
5
6
# .github/workflows/lint.yml
- uses: actions/setup-python@v5
  with:
    python-version: '3.11'
- run: pip install pre-commit
- run: pre-commit run --all-files

prekの場合:

1
2
# .github/workflows/lint.yml
- uses: j178/prek-action@v1

セットアップステップが不要になります。

開発環境の依存削減

pre-commitの依存関係:

プロジェクト
├── Python 3.11(アプリ用)
└── Python 3.9(pre-commit用、virtualenv)
    └── pre-commit
        └── 各フックの依存関係

prekの依存関係:

プロジェクト
└── prek(単一バイナリ)
    └── 各フックの依存関係

Pythonバージョン競合のリスクがなくなります。

クロスプラットフォーム対応

同一バイナリがWindows/macOS/Linuxで動作:

1
2
3
# どのOSでも同じコマンド
prek install
prek run --all-files

開発環境の差異を吸収します。

移行手順

1. prekのインストール

1
2
3
4
5
6
7
8
# Homebrew
brew install prek

# uv
uv tool install prek

# cargo
cargo install prek

2. 既存のpre-commitをアンインストール

1
pre-commit uninstall

3. prekをインストール

1
prek install

.pre-commit-config.yamlはそのまま使用できます。

4. 動作確認

1
2
3
4
5
6
7
8
# フック一覧表示
prek list

# 全ファイルで実行
prek run --all-files

# 特定フックのみ実行
prek run trailing-whitespace end-of-file-fixer

5. GitHub Actions更新

1
2
3
4
5
# Before
- uses: pre-commit/[email protected]

# After
- uses: j178/prek-action@v1

prekの追加機能

pre-commitにはない便利な機能:

フック一覧表示

1
2
3
4
5
6
7
8
$ prek list
.:trailing-whitespace
.:end-of-file-fixer
.:check-yaml
.:check-toml
.:ruff
.:ruff-format
.:mypy

ディレクトリ指定実行

1
2
3
4
5
# srcディレクトリのみ
prek run --directory src

# 複数ディレクトリ
prek run --directory src --directory tests

最終コミット対象のみ実行

1
prek run --last-commit

モノレポ対応

サブプロジェクトごとに.pre-commit-config.yamlを配置可能:

monorepo/
├── .pre-commit-config.yaml  # ルート
├── frontend/
│   └── .pre-commit-config.yaml
└── backend/
    └── .pre-commit-config.yaml
1
2
3
4
5
# 全プロジェクト実行
prek run

# 特定プロジェクトのみ
prek run frontend backend

注意点

1. 開発中のツール

現在v0.3.1。一部の言語とサブコマンドが未実装です:

本番導入前に、使用するフックの動作確認を推奨します。

2. pre-commit独自機能

一部のpre-commit独自機能は未対応の可能性があります。移行前に.pre-commit-config.yamlの内容を確認してください。

他のツールとの比較

ツール言語pre-commit互換依存
prekRust✅ 完全なし
lefthookGo❌ 独自設定なし
hkRust❌ 独自設定なし
HuskyNode.js❌ 独自設定Node.js
pre-commitPython-Python

設定互換性の重要性:

lefthookやhkも高速ですが、既存の.pre-commit-config.yamlを書き換える必要があります。prekは設定ファイルをそのまま使えるため、移行コストがゼロです。

採用実績

著名なOSSプロジェクトが採用:

まとめ

prekの本質的な価値は「速さ」ではなく「ポータビリティ」です:

  • 依存関係の削減 - Pythonランタイム不要
  • CI/CDの簡素化 - セットアップステップ削減
  • 開発環境の統一 - クロスプラットフォーム対応
  • 移行コストゼロ - 既存設定をそのまま使用可能

非Pythonプロジェクトや、チーム全体の開発環境を簡素化したい場合に特におすすめです。

興味のある方はぜひ試してみてください。

参考リンク