pre-commit on Ubuntu — コード品質を自動チェックするGitフック設定

開発環境

「コードのインデントが揃っていない」「行末にスペースが残っている」——そういった指摘をコードレビューで毎回受けると、本質的な議論の時間が削られます。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 バージョンは異なる)

目次

  1. pre-commit とは
  2. 前提環境
  3. インストール(pipx 経由)
  4. 設定ファイル(.pre-commit-config.yaml)を作る
  5. git フックを有効化する
  6. コミット時の自動チェックを試す
  7. よく使うフック一覧
  8. よくあるエラーと解決策
  9. まとめ

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 で実行)。




ubuntu@linuxlab: ~
$ lsb_release -a
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 のエラーが出ます。




ubuntu@linuxlab: ~
$ pip install pre-commit
error: externally-managed-environment
× This environment is externally managed

hint: See PEP 668 for the detailed specification.

pipx を使うとシステムのPython環境を汚さずに pre-commit をインストールできます。




ubuntu@linuxlab: ~
$ sudo apt update
$ 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 install pre-commit の実行ログ(Ubuntu 24.04.4 LTS)
pipx install pre-commit の実行ログ(Ubuntu 24.04.4 LTS)
pre-commit 4.6.0 インストール on Ubuntu 24.04.4 LTS(実測)
pre-commit 4.6.0 インストール on Ubuntu 24.04.4 LTS(実測)

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 実測)。

Ubuntu バージョン別 pre-commit 環境比較(実測)
Ubuntu バージョン別 pre-commit 環境比較(実測)

設定ファイル(.pre-commit-config.yaml)を作る

プロジェクトのルートに .pre-commit-config.yaml を作成します。




ubuntu@linuxlab: ~/myproject
$ cat > .pre-commit-config.yaml << ‘EOF’
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 を使います。




ubuntu@linuxlab: ~/myproject
$ 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 でフックを有効化します。




ubuntu@linuxlab: ~/myproject
$ 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
pre-commit install が書き込む .git/hooks/pre-commit(実測)
pre-commit install が書き込む .git/hooks/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 に手順を書くか、Makefilesetup ターゲットに組み込む方法が一般的です。

コミット時の自動チェックを試す

実際にコミットして、フックが走ることを確認します。末尾にスペースのある Python ファイルを使って試しました。




ubuntu@linuxlab: ~/myproject
# 行末にスペースが2つ残っているファイルを作成
$ 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 してからコミットし直す必要があります。




ubuntu@linuxlab: ~/myproject
# 修正されたファイルを再度 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
pre-commit フックが末尾スペースを自動修正(実測)
pre-commit フックが末尾スペースを自動修正(実測)
コミット時の pre-commit フック実行(成功ケース)
コミット時の pre-commit フック実行(成功ケース)

2回目のコミットでは全フックが Passed になり、コミットが通りました。check yaml は YAML ファイルが存在しなかったため Skipped と表示されています。これは正常な動作です。

著者アイコン
著者アイコン

初回実行は「Installing environment…」と出て少し時間がかかります。これは pre-commit がフック用の仮想環境を ~/.cache/pre-commit/ に構築しているためです。2回目以降はキャッシュが使われるので即座に起動します。

フックをスキップして緊急コミットする

どうしてもフックを飛ばしてコミットしたい場面(WIP コミット等)では --no-verify オプションを使います。




ubuntu@linuxlab: ~/myproject
$ git commit –no-verify -m “WIP: 作業途中”
[main b2c3d4e] WIP: 作業途中

注意

--no-verify は非常用です。常用するとフックの意味がなくなるため、WIPコミット専用と理解して使いましょう。

よく使うフック一覧

pre-commit-hooks v4.5.0 で利用できる主なフックを一覧にしました。

pre-commit-hooks 主要フック一覧(v4.5.0)
pre-commit-hooks 主要フック一覧(v4.5.0)

Ruff(Python コード品質チェック)を追加する

Python プロジェクトでは Flake8 の後継として Ruff が人気です。.pre-commit-config.yaml に追記するだけで使えます。




ubuntu@linuxlab: ~/myproject
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
– 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 を指定します。




ubuntu@linuxlab: ~/myproject
hooks:
– id: trailing-whitespace
files: \.(py|yaml|yml|md)$
– id: ruff
exclude: ^tests/fixtures/

よくあるエラーと解決策

①「pre-commit: command not found」

pipx でインストールしたが ~/.local/bin が PATH に入っていないケースです。




ubuntu@linuxlab: ~
pre-commit: command not found

# 解決策:
$ pipx ensurepath
$ source ~/.bashrc
$ pre-commit –version
pre-commit 4.6.0

②「git not found」

git がインストールされていないか、リポジトリ外で実行しているケースです。




ubuntu@linuxlab: ~
An error has occurred: RuntimeError: Failed to find git executable

# 解決策:git をインストールしてリポジトリ内で実行
$ sudo apt install -y git
$ cd /path/to/your/repo
$ pre-commit install

③「deprecated stage names (commit, push)」の WARNING

フックのリポジトリが古い記法を使っているための警告で、動作には影響ありません。




ubuntu@linuxlab: ~/myproject
[WARNING] repo `https://github.com/pre-commit/pre-commit-hooks` uses deprecated stage names
(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 をワークフローに組み込みます。




.github/workflows/pre-commit.yml
name: pre-commit
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 環境が手に入ります。

コメント

タイトルとURLをコピーしました