神楽坂のシステムやさん通信

npm install だけで Git Hooks を全員に自動設定する方法

うぱるぱ tech
npm install だけで Git Hooks を全員に自動設定する方法

「自分だけ Git Hooks が動いていなかった」をゼロにする

チーム開発において、「コードを push する前にローカルでテストを回す」という運用は、CI の待ち時間を減らし、開発サイクルを高速化するために非常に重要です。

しかし、Git Hooks が格納される .git/hooks/ ディレクトリは Git の管理対象に含まれません。そのため、プロジェクトをクローンした後に各自が手動で設定を再現する必要があり、それが以下のような問題を引き起こします。

  • 設定の失念: 新規参画時や環境再構築の際、手動コマンドの実行を忘れてしまう
  • 更新の追従漏れ: フックの内容(スクリプト)を修正しても、全員に手動での再設定を徹底させるのが難しい
  • 強制力の欠如: 設定の有無が各自の裁量に委ねられ、プロジェクト全体でテスト品質を担保できない

せっかく CI を導入していても、ローカルでのチェックが漏れてしまっては、フィードバックの速度が落ちてしまいます。

そこで、「npm install という誰もが必ず行う操作」に Git Hooks のセットアップを組み込むことで、意識せずとも全員の環境を同じ状態に保つ――そんな「仕組みによる解決」を目指します。

具体的には、Husky などの追加ライブラリを使わず、Git の標準機能と npm scripts だけで完結させる方法を解説します。

GitHub Actions とローカルGit Hooks の共存

ローカルでテストを実行したからといって、CIでのテストが不要になるわけではありません。それぞれ役割が異なるため、併用するのがおすすめです。

観点GitHub ActionsローカルGit Hooks
実行タイミングpush後push前
フィードバック速度CIの起動・実行を待つ必要がある手元で即座に結果が分かる
環境の一貫性統一された環境で実行されるローカル環境の個別事情に左右される
強制力高い(回避不可)中程度(--no-verifyで回避可能)
リソースコストCI実行時間を消費個人のPCリソースのみ

ローカルで素早くフィードバックを得つつ、CIで環境差異のない確実なチェックを行う。この組み合わせが開発効率と品質の両面で効果的です。

方法:core.hooksPath + npm prepare の組み合わせ

以下の3ステップで実現できます。

1. プロジェクトにhooksディレクトリを作成

mkdir -p .githooks

2. フックスクリプトを作成

例:push前にテストを実行する pre-push フック

# .githooks/pre-push
#!/bin/bash

echo "🧪 Running tests before push..."

# プロジェクトのテストを実行
npm test

if [ $? -ne 0 ]; then
  echo "❌ Tests failed. Push aborted."
  exit 1
fi

echo "✅ All tests passed. Proceeding with push."

作成後、実行権限を付与します:

chmod +x .githooks/pre-push

3. package.json に prepare スクリプトを追加

{
  "scripts": {
    "prepare": "git config core.hooksPath .githooks"
  }
}

これだけです!

なぜこれで自動化できるのか

prepare スクリプトの特徴:

  • npm install の後に自動実行される
  • npm ci でも実行される
  • Git cloneした後、最初に npm install を実行するのは自然な流れ

core.hooksPath の特徴:

  • .git/hooks/ の代わりに任意のディレクトリをhooks置き場に指定できる
  • プロジェクトルートの .githooks/ を指定すれば、フックのロジック自体を Git 管理下に置けるため、スクリプトの更新もリポジトリ経由で全員に同期されます。

この2つを組み合わせることで、リポジトリをcloneして npm install するだけで、特別な操作なしにGit Hooksが有効になります。

新メンバーのオンボーディングが簡単に

従来の方法では:

  1. リポジトリをclone
  2. npm install
  3. 「あ、READMEにGit Hooksの設定手順が書いてあるな…」
  4. 手動で git config core.hooksPath .githooks を実行
  5. (忘れる人続出)

この方法なら:

  1. リポジトリをclone
  2. npm installこれだけで完了!

新メンバーへの説明も「npm installしてね」の一言で済みます。

複数プロジェクト(モノレポ)での対応

ルートに複数のサブプロジェクトがある場合:

project-root/
├── .githooks/
│   └── pre-push
├── frontend/
│   └── package.json
├── backend/
│   └── package.json
└── package.json  ← ルートに用意

ルートの package.json で設定すれば、どのサブプロジェクトから npm install しても機能します。

実際のpre-pushフック例

#!/bin/bash

echo "🧪 Running pre-push checks..."

# フロントエンドのテスト
if [ -d "frontend" ]; then
  echo "📦 Testing frontend..."
  cd frontend && npm test
  if [ $? -ne 0 ]; then
    echo "❌ Frontend tests failed."
    exit 1
  fi
  cd ..
fi

# バックエンドのテスト
if [ -d "backend" ]; then
  echo "📦 Testing backend..."
  cd backend && npm test
  if [ $? -ne 0 ]; then
    echo "❌ Backend tests failed."
    exit 1
  fi
  cd ..
fi

echo "✅ All checks passed!"

まとめ

  1. GitHub Actionsだけに頼らず、ローカルでも素早くテストを回す
  2. .githooks/ ディレクトリを作成してフックスクリプトを配置
  3. package.jsonpreparegit config core.hooksPath .githooks を設定
  4. これでチーム全員が npm install するだけで自動的にGit Hooksが有効に!

push前に手元でテストを実行する習慣が、自然とチーム全体に広がります。 設定忘れによる「テストを通さずにpushしてしまった」という事故も防げますし、CIの待ち時間に悩まされることも減るでしょう。