Gitのpre-commitに必ず入れるべきファイル名とサイズのチェック処理

Gitのpre-commitで自動ファイルチェック

Gitを利用したチーム開発において、「うっかり」はつきものです。

全角スペースの入ったファイル名、プロジェクト外の巨大なバイナリデータ、そして機密情報を含んだ予期せぬファイルなど。

これらが一度リモートリポジトリにプッシュされると、履歴を書き換えない限り完全に消去することは難しくなります。

そこで有効なのが、Gitのpre-commitフックを利用した自動チェックです。

pre-commitのファイルチェックを導入するメリット

pre-commitはgit commitコマンドを実行後、コミットメッセージを入力する前に実行されるスクリプトです。

pre-commitでチェックを行うことで、以下のメリットが得られます。

情報漏洩と拡張子の表記揺れの防止

許可していない拡張子(例:.envや.sqlなど)のコミットを未然に防ぐことで、機密情報がリポジトリに混入するリスクを大幅に下げられます。

こういうのは.gitignoreで設定されていることが多いですが、.gitignoreは無視はできても許可はできないので、pre-commitでも設定したほうが安全です。

Web制作では「.html」と「.htm」、「.jpg」と「.jpeg」のように同じ種類のファイルなのに異なる拡張子が存在するため、拡張子の統一にも役立ちます。

環境依存トラブルやリンク切れの回避

ファイル名に全角英数字や空白が含まれていると、OS(Windows/Mac/Linux)間でのファイル共有時にパスの不整合やビルドエラーの原因となります。

「foo.jpg」が「foo .jpg」でパスを「/image/foo.jpg」で指定したらリンク切れになるトラブルも回避できます。

リポジトリの肥大化防止

高解像度の画像や不要なログファイルなどの巨大なファイルが混入すると、クローン速度の低下など、チーム全体の生産性を損なわせます。

ログファイルやSQLなどのデータベース関連ファイルだと機密情報が含まれていることが多いので、情報漏洩対策としても役立ちます。

pre-commitの実装コード例

pre-commitは以下のスクリプトをリポジトリ内の .git/hooks/pre-commit として保存し、実行権限を与えることで実装できます。

pre-commit
#!/bin/sh

# 制限サイズ (1MB)
LIMIT=$((1024 * 1024))

# ステージングされたファイル名のみを対象にする
git diff --cached -z --name-only --diff-filter=ACM | while IFS= read -r -d '' f; do
  [ -f "$f" ] || continue

  # 1. 全角英数字および空白文字のチェック
  if echo "$f" | grep -q "[A-Za-z0-9[:space:]]"; then
    echo "Error: ファイル名に不正な文字(全角英数字または空白)が含まれています: '$f'"
    exit 1
  fi

  # 2. 拡張子のチェック
  ext=$(echo "${f##*.}" | tr '[:upper:]' '[:lower:]')
  case "$ext" in
    html|scss|tsx|ts|json|yaml|yml|toml|md|jpg|png|svg|gitignore) ;;
    *)
      echo "Error: 許可されていない拡張子です。設定を確認してください: $f"
      exit 1
      ;;
  esac

  # 3. サイズチェック (1MB制限)
  if [ "$(wc -c < "$f")" -gt "$LIMIT" ]; then
    echo "Error: ファイルサイズが 1MB を超えています: $f"
    exit 1
  fi
done || exit 1

まとめ

Git使用時の「個人の注意」には限界があります。

pre-commitによる自動チェックを導入することで、人為的なミスをシステムで防ぎ、クリーンで安全なリポジトリを維持できます。

Gitleaksを追加すると機密情報漏洩のチェックがさらに強固になるのでオススメです。

カテゴリーgit