Skip to main content

Clang Format Pre-Commit

pythonのインストール

学校のパソコンには多分インストールされている!

↓のサイトから、pythonインストーラーをダウンロード

https://www.python.org/downloads/windows/

Stable Releasesから、Windows insallerを選ぼう! たぶん 64-bitでいいよ!

スクリーンショット 2026-10-18 222532.png

インストーラーを起動すると、こういう画面になると思います

スクリーンショット 2026-10-18 222725.png

スクリーンショット 2026-10-18 222738.png

まず、Add python.exe to PATHにチェックを入れよう!!!

必ず、Add python.exe to PATHにチェックを入れよう!!!

そしたら、 Customize installationを押そう!

スクリーンショット 2026-10-18 223031.png

上のような画面になるよ! 全部チェックつけてていいと思う! 少なくとも pip はチェックつけよう

スクリーンショット 2026-10-18 223209.png

こういう画面になるよ!

Add Python to environment variables にはチェックを入れよう!

あとはインストール先のフォルダとか指定して、Installを押せばいけるはず

コマンドプロンプトで試しに py --version とか押して動いたらOK

pre-commitのインストール

pip install pre-commit

リポジトリにpre-commitを適用

pre-commit install

上のコマンドを「プロジェクトのルートディレクトリ」で実行!!

  • 「プロジェクトのルートディレクトリ」が適切な言い方か分からないけど、.gitフォルダとか.sln (ソリューションファイル)が置いてあるフォルダ!!

.git/hooks にpre-commit ってファイル(拡張子なし)があればOK

使うとき!

このようなコードがあったとします!

※ FormatTest.cpp に書かれています!

スクリーンショット 2026-10-18 192252.png

このコードをコミットしようと思います!

スクリーンショット 2026-10-18 191943.png

すると…

スクリーンショット 2026-10-18 192129.png

怒られました!

Failedと書いていますね! コミットに失敗しました!

files were modified by this hook とあるように、勝手に編集してくれてます!

下図のように! わあ、きれい!

スクリーンショット 2026-10-18 192047.png

あとは、「変更」メニューから、clang-format が自動で行った変更をステージングしよう!

スクリーンショット 2026-10-18 192335.png


<aside>

※「ステージング済みをコミット」じゃなくて、「すべてをコミット」の場合でもpre-commitは動きます

</aside>

もしも、下の画像みたいな警告が出たら!

スクリーンショット 2026-10-18 192708.pngスクリーンショット 2026-10-18 192708.png

この警告は、

一つのファイルの一部分だけをコミットをしようとした際に発生する可能性があります。

pre-commitの流れは、

  1. 未ステージングの変更をスタッシュする
  2. clang-formatが、ステージングされたファイルを自動で修正する
  3. 未ステージングの変更を元に戻す

ってなっていると思われます。

で、clang-formatが書き換えた箇所と、スタッシュしていた箇所が被っているとコンフリクトが発生すると思われます。

この警告が出た際は、clang-formatによる書き換えは無かったことにされるので、ファイルがぶっ壊れることはないです。

で、対策としては

  • すべての変更をステージングしてしまう
  • 手動でclang-formatを動かして、ファイルを修正させてからコミット
    • Ctrl + K → Ctrl + D で現在開いているファイルをclang-formatに修正されることができるよ
  • pre-commitを無視してコミット
    • どうしてもpre-commitをスキップしたい時だけ、下記のようにコマンドを打とう
git commit -m "your message" --no-verify