ちょっと話題の記事

【Git】コミット直前に自動でファイルを整形する「pre-commit」が便利すぎたので紹介したい

2022.11.19

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

今回のテーマ

こんにちは「すずめの戸締りを見ました」AWS事業本部コンサルティング部のこーへいです。

今回のテーマは「pre-commit」です。

テーマの背景

現在担当している案件にてCloudFormationファイルの作成の為、Gitを使用しているのですが、チームの方から「『pre-commit』でコミット直前に自動的にファイルを評価し、整形してくれるツールがある」と教えていただきました。

実際にすごく便利で、是非読者の方に紹介したいと思った次第です。

この記事で何がわかるか

  • 「pre-commit」のセットアップ方法
  • 不要な半角スペースを消してみる

セットアップ方法

基本的には公式ドキュメントに簡潔にやり方は記載されており、手順としては以下3ステップしかありません。

  • 「pre-commit」をインストール
  • 設定ファイルを作成
  • 設定ファイルをリポジトリに読み込ませる

「pre-commit」をインストール

pipやbrew、conda等を使用してインストールが可能です。
Macユーザーである自分はbrewでインストールしました。

$ brew install pre-commit

設定ファイルを作成

リポジトリのルートディレクトリ直下に「.pre-commit-config.yaml」ファイルを作成します。 サンプル版として以下のコマンドを実行して設定ファイルを作成してみましょう。

$ pre-commit sample-config > .pre-commit-config.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

設定ファイルをリポジトリに読み込ませる

最後に忘れがち(と勝手に思っている)なコマンドを実行し、作成した設定ファイルをリポジトリに読み込ませましょう。

pre-commit install

不要な半角スペースを消してみる

# 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

「.pre-commit-config.yaml」ファイルのhooksにある「trailing-whitespace」は、こちらのページtrims trailing whitespace.(行末の半角スペースを取り除く)と説明されています。

実際にコミット前に半角スペースが取り除かれるか検証してみましょう!

test.yamlファイルを作成

検証用のyamlファイル「test.yaml」を作成します

whitespace-test:
  whitespace-0: 0
  whitespace-1: 1・
  whitespace-2: 2・・
  whitespace-3: 3・・・
  whitespace-4: 4・・・・
  whitespace-5: 5・・・・・
# ・は半角スペースを表している

上記のように各行には数字の数だけ半角スペースが存在しています。

この状態で以下のコマンドを実行すると

$ git add -A
$ git commit -m "test.yaml作成"

Trim Trailing Whitespaceのみ失敗しているのがわかり、その後Fixing test.yamlで修正されています。

再度ファイルを確認してみると、

whitespace-test:
  whitespace-0: 0
  whitespace-1: 1
  whitespace-2: 2
  whitespace-3: 3
  whitespace-4: 4
  whitespace-5: 5
# ・は半角スペースを表している

綺麗に行末の半角スペースが削除されています!
修正されていますが、コミットは失敗しているので、自動的に修正された分も含めて再度以下コマンドを実行してみましょう。

$ git add -A
$ git commit -m "test.yaml作成"

そうすると以下のようにきちんとパスし、コミットされました。

他にどのような機能があるのか

上記のページに利用できる機能の一覧があるので、必要に応じて「.pre-commit-config.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
  • end-of-file-fixer:ファイルが空であるか、1つの改行で終わっていること
  • check-yaml:yaml ファイルが解析可能な構文であるかどうかをチェックする
  • check-added-large-files:巨大なファイルがコミットされないようにする

といった機能が搭載されています!

自分はCloudformationファイルの作成のためにcfn-lintを取り入れて、コミット直前にファイル内容にエラーがないかの静的解析を実行しています。

設定例

repos:
  - repo: https://github.com/aws-cloudformation/cfn-lint
    rev: v0.71.0  
    hooks:
      - id: cfn-lint
        files: cfn/.*\.(json|yml|yaml)$

  - repo: https://github.com/pre-commit/pre-commit-hooks
    rev: v4.3.0
    hooks:
        - id: trailing-whitespace
        - id: end-of-file-fixer
        - id: check-yaml
        - id: check-added-large-files

まとめ

あまり「pre-commit」に関する日本語記事がなかったので、今回記事にしました。 「pre-commit」は非常に便利なツールなので是非使用してみてください!