「コードのインデントが揃っていない」「行末にスペースが残っている」——そういった指摘をコードレビューで毎回受けると、本質的な議論の時間が削られます。pre-commit は git commit の直前に自動でコードチェックを実行するツールで、一度設定してしまえばフォーマットのミスはコミット前に自動修正されます。
Ubuntu 24.04 LTS で実際に動かした結果を載せます。pre-commit 4.6.0 / Python 3.12.3 の環境で、インストールからフック動作の確認まで通しで試しました。
この記事のポイント
- Ubuntu 24.04 LTS では
pipx install pre-commitが推奨(pip 直接はPEP 668エラー) pre-commit installで.git/hooks/pre-commitが生成され、以降のgit commit時に自動でフックが走る.pre-commit-config.yamlに書くだけで trailing-whitespace・YAML構文チェック等を一括設定できる- フックが失敗するとコミットはブロックされ、自動修正されたファイルは
git addして再コミットする - 実測:Ubuntu 22.04 も 24.04 も pre-commit 4.6.0 が入る(Python バージョンは異なる)
目次
- pre-commit とは
- 前提環境
- インストール(pipx 経由)
- 設定ファイル(.pre-commit-config.yaml)を作る
- git フックを有効化する
- コミット時の自動チェックを試す
- よく使うフック一覧
- よくあるエラーと解決策
- まとめ
pre-commit とは
pre-commit は、git フックを使ってコミット前に自動でコードチェックを走らせるフレームワークです。
git には「特定のイベント(commit・push など)の直前に任意のスクリプトを実行する」仕組みがあります。これが「git フック」です。.git/hooks/pre-commit というファイルを置けば、git commit のたびにそのスクリプトが実行されます。
pre-commit ツールは、この仕組みを簡単に管理できるようにしたものです。設定ファイル(.pre-commit-config.yaml)に使いたいフックを書くだけで、trailing-whitespace(行末スペース)・YAML構文チェック・Flake8 によるPythonコード検査など、さまざまなツールを自動で走らせられます。
チーム開発では全員が同じ設定ファイルを使うため、「自分のエディタではOKだったのにCIで落ちた」という状況を事前に防げます。
前提環境
動作確認済み環境
本記事のコマンドは以下の環境で実測しています(Docker公式イメージ ubuntu:24.04 で実行)。
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 24.04.4 LTS
Release: 24.04
Codename: noble
$ python3 –version
Python 3.12.3
$ git –version
git version 2.43.0
git がインストールされていることが前提です。まだの場合は sudo apt install git で入れてください。git リポジトリが存在しない(git init 前)の場合、フックのインストールで失敗します。
インストール(pipx 経由)
Ubuntu 24.04 では pip install pre-commit を実行すると PEP 668 のエラーが出ます。
error: externally-managed-environment
× This environment is externally managed
…
hint: See PEP 668 for the detailed specification.
pipx を使うとシステムのPython環境を汚さずに pre-commit をインストールできます。
$ sudo apt install -y pipx git
Setting up pipx (1.4.3-1) …
$ pipx install pre-commit
installed package pre-commit 4.6.0, installed using Python 3.12.3
These apps are now globally available
– pre-commit
$ pipx ensurepath
Success! Added /root/.local/bin to the PATH environment variable.
Restart your shell or run `source ~/.bashrc` to apply.
$ source ~/.bashrc
$ pre-commit –version
pre-commit 4.6.0


pipx ensurepath を実行すると ~/.local/bin が PATH に追加されます。シェルを再起動するか source ~/.bashrc を実行しないと pre-commit コマンドが見つからないため、この手順は忘れずに。
Ubuntu 22.04 でも同じ手順で OK
Ubuntu 22.04 LTS では Python 3.10.12・pip 22.0.2・git 2.34.1 が入りますが、pipx install pre-commit で同じ pre-commit 4.6.0 がインストールされます(2026-06-22 実測)。

設定ファイル(.pre-commit-config.yaml)を作る
プロジェクトのルートに .pre-commit-config.yaml を作成します。
repos:
– repo: https://github.com/pre-commit/pre-commit-hooks
rev: v4.5.0
hooks:
– id: trailing-whitespace
– id: end-of-file-fixer
– id: check-yaml
– id: check-added-large-files
EOF
各フィールドの意味はこうなっています。
repo:フックの提供元(GitHubリポジトリURL)rev:使用するバージョンタグ(v4.5.0と固定することで動作が安定する)hooks:有効にするフックのIDリスト
pre-commit-hooks は公式が提供する基本フック集です。これ1つで trailing-whitespace・end-of-file-fixer・check-yaml・check-json など汎用的なチェックが揃います。
フックのバージョンを最新に更新する
rev: v4.5.0 と固定していますが、最新バージョンを自動で確認したい場合は pre-commit autoupdate を使います。
Updating https://github.com/pre-commit/pre-commit-hooks … already up to date.
CI環境では rev を固定しておくほうが再現性が上がります。定期的に autoupdate を実行してバージョンを更新する運用が一般的です。
git フックを有効化する
設定ファイルを作っただけでは、まだ git commit 時に自動で走りません。pre-commit install でフックを有効化します。
pre-commit installed at .git/hooks/pre-commit
$ ls -la .git/hooks/ | grep -v ‘\.sample’
drwxr-xr-x 2 ubuntu ubuntu 4096 Jun 22 09:31 .
drwxr-xr-x 7 ubuntu ubuntu 4096 Jun 22 09:31 ..
-rwxr-xr-x 1 ubuntu ubuntu 633 Jun 22 09:31 pre-commit

実測では git init 直後の .git/hooks/ には *.sample ファイルしかありませんでしたが、pre-commit install を実行すると 633バイトの pre-commit スクリプトが追加されました。このスクリプトが pipx でインストールした pre-commit 本体(/root/.local/share/pipx/venvs/pre-commit/bin/python)を呼び出す仕組みになっています。
注意:.git/hooks/ は git 管理外
.git/ ディレクトリ以下は git で追跡されません。チームで使う場合、メンバーが各自のリポジトリで pre-commit install を実行する必要があります。README に手順を書くか、Makefile の setup ターゲットに組み込む方法が一般的です。
コミット時の自動チェックを試す
実際にコミットして、フックが走ることを確認します。末尾にスペースのある Python ファイルを使って試しました。
$ printf ‘name = “hello” \nversion = “1.0” \n’ > test.py
$ git add test.py
$ git commit -m “add test.py”
[INFO] Installing environment for https://github.com/pre-commit/pre-commit-hooks.
[INFO] Once installed this environment will be reused.
trim trailing whitespace………………………………………….Failed
– hook id: trailing-whitespace
– exit code: 1
– files were modified by this hook
Fixing test.py
コミットはブロックされ、test.py が自動修正されました。フックが「失敗」した場合、ファイルを修正するだけではコミットされません。修正後のファイルを git add してからコミットし直す必要があります。
$ git add test.py
$ git commit -m “add test.py”
trim trailing whitespace………………………………………….Passed
fix end of files…………………………………………………Passed
check yaml…………………………………….(no files to check)Skipped
check for added large files……………………………………….Passed
[main a1b2c3d] add test.py


2回目のコミットでは全フックが Passed になり、コミットが通りました。check yaml は YAML ファイルが存在しなかったため Skipped と表示されています。これは正常な動作です。
フックをスキップして緊急コミットする
どうしてもフックを飛ばしてコミットしたい場面(WIP コミット等)では --no-verify オプションを使います。
[main b2c3d4e] WIP: 作業途中
注意
--no-verify は非常用です。常用するとフックの意味がなくなるため、WIPコミット専用と理解して使いましょう。
よく使うフック一覧
pre-commit-hooks v4.5.0 で利用できる主なフックを一覧にしました。

Ruff(Python コード品質チェック)を追加する
Python プロジェクトでは Flake8 の後継として Ruff が人気です。.pre-commit-config.yaml に追記するだけで使えます。
– repo: https://github.com/pre-commit/pre-commit-hooks
rev: v4.5.0
hooks:
– id: trailing-whitespace
– id: end-of-file-fixer
– id: check-yaml
– repo: https://github.com/astral-sh/ruff-pre-commit
rev: v0.4.4
hooks:
– id: ruff
– id: ruff-format
ruff が構文チェック・未使用インポートの検出、ruff-format が Black 互換のフォーマットを担当します。
特定ファイルだけフックを適用する
特定のファイルにのみフックを適用したい場合は files または exclude を指定します。
– id: trailing-whitespace
files: \.(py|yaml|yml|md)$
– id: ruff
exclude: ^tests/fixtures/
よくあるエラーと解決策
①「pre-commit: command not found」
pipx でインストールしたが ~/.local/bin が PATH に入っていないケースです。
# 解決策:
$ pipx ensurepath
$ source ~/.bashrc
$ pre-commit –version
pre-commit 4.6.0
②「git not found」
git がインストールされていないか、リポジトリ外で実行しているケースです。
# 解決策:git をインストールしてリポジトリ内で実行
$ sudo apt install -y git
$ cd /path/to/your/repo
$ pre-commit install
③「deprecated stage names (commit, push)」の WARNING
フックのリポジトリが古い記法を使っているための警告で、動作には影響ありません。
(commit, push) which will be removed in a future version.
Hint: often `pre-commit autoupdate` will fix this.
# autoupdate で最新バージョンに更新
$ pre-commit autoupdate
④ CI(GitHub Actions 等)でも pre-commit を走らせたい
ローカルでのフック設定に加え、CI で全ブランチのプッシュ時にも検査したい場合は pre-commit run --all-files をワークフローに組み込みます。
on: [push, pull_request]
jobs:
pre-commit:
runs-on: ubuntu-latest
steps:
– uses: actions/checkout@v4
– uses: actions/setup-python@v5
with:
python-version: ‘3.12’
– uses: pre-commit/action@v3.0.1
公式が提供する pre-commit/action を使えば pip インストール等の手順を書かずに済みます。
まとめ
Ubuntu 24.04 LTS で pre-commit を使ったコード品質自動チェックの設定手順を実測しました。
- インストール:
sudo apt install pipx && pipx install pre-commit(Ubuntu 24.04 では pipx 必須) - 設定ファイル:プロジェクトルートに
.pre-commit-config.yamlを置いてフックを列挙する - 有効化:
pre-commit installで.git/hooks/pre-commitが生成され、以降のgit commit時に自動で走る - フック失敗時は自動修正済みファイルを
git addしてから再コミット - Ubuntu 22.04 / 24.04 ともに pre-commit 4.6.0 が入る(Python のバージョンは異なる)
一度設定してしまえば意識しなくて済むのが pre-commit の良いところです。レビューで「行末スペースを消してください」といった指摘がなくなるだけで、議論の密度が上がります。
本格的なサーバー環境で開発したい場合は、VPS を使うと手元の環境に左右されない一貫した Linux 環境が手に入ります。



コメント