pre-commit ================== `pre-commit `_ は Git のコミット前に自動でチェックを行うためのフレームワーク。 インストール ------------------ .. code-block:: console $ pip install pre-commit 設定ファイルの作成 --------------------------------- リポジトリのルートディレクトリに ``.pre-commit-config.yaml`` というファイル名で 設定ファイルを配置しておく必要がある。 サンプルの設定ファイルを生成するには次のコマンドを実行する。 .. code-block:: console $ pre-commit sample-config > .pre-commit-config.yaml コマンドを実行すると次のように設定ファイルが生成される。 .. code-block:: yaml # See https://pre-commit.com for more information # See https://pre-commit.com/hooks.html for more hooks repos: - repo: https://github.com/pre-commit/pre-commit-hooks rev: v3.2.0 hooks: - id: trailing-whitespace - id: end-of-file-fixer - id: check-yaml - id: check-added-large-files hooks の項目を追加していくことで様々なチェックを行うことができる。 公式の `Supported hooks `_ のページを見ると、 かなりの数の hook が用意されいることが分かる。 Git への登録 --------------- 次のコマンドを実行すると pre-commit で登録した hook がコミット前に実行されるようになる。 .. code-block:: console $ pre-commit install 動作例を以下に示す。 .. code-block:: console $ git commit -m "test" [WARNING] Unstaged files detected. [INFO] Stashing unstaged files to /home//.cache/pre-commit/patch1625801172-570995. Trim Trailing Whitespace.................................................Failed - hook id: trailing-whitespace - exit code: 1 - files were modified by this hook Fixing NOTICE.txt Fix End of Files.........................................................Passed Check Yaml...........................................(no files to check)Skipped Check for added large files..............................................Passed [INFO] Restored changes from /home//.cache/pre-commit/patch1625801172-570995. 設定ファイルに記述したチェック項目で違反があればコミットに失敗する。 簡単に修正できるようなものについては自動で修正されるが、 Git のステージへの追加まではされない。 ユーザが問題ないか確認したあとステージし、 改めてコミットを行うという流れになる。 全てのファイルへの適用 ------------------------------ 設定を作成・更新したときや、CI でチェックを行いたい場合などには、 次のようなコマンドで全てのファイルに対するチェックを行うことができる。 .. code-block:: console $ pre-commit run --all-files このページを書いた際に、このページを作成しているリポジトリに適用してみた結果、 以下のように自動で修正が行われた。 .. code-block:: console $ pre-commit run --all-files Trim Trailing Whitespace.................................................Failed - hook id: trailing-whitespace - exit code: 1 - files were modified by this hook Fixing source/development/python/pipenv.rst Fix End of Files.........................................................Failed - hook id: end-of-file-fixer - exit code: 1 - files were modified by this hook Fixing source/development/tools_and_libs.csv Fixing source/KIcon/LICENSE.txt Fixing NOTICE.txt Fixing .gitignore Fixing source/development/cpp/pybind11/require_python_shared.rst Fixing LICENSE.txt Fixing source/KIcon/NOTICE.txt Check Yaml...............................................................Passed Check for added large files..............................................Passed $ echo $? 1 修正時は終了ステータスが 1 になるため、 上記のコマンドは CI のチェックにも使える。 設定ファイルの更新 ------------------------- 設定ファイル ``.pre-commit-config.yaml`` には 使用している hook のバージョンが記されている。 そのバージョンをまとめて最新化するには、以下のコマンドを実行する。 .. cspell: ignore autoupdate .. code-block:: console $ pre-commit autoupdate