⚙️ 自動化

Git Hooks 設定

コード品質チェックとワークフロー強制のための Git hooks を設定します

★★★ 上級 25 min 2025年1月13日

ユースケース

Git hooks はコミットやプッシュの前に品質チェックを自動化します。Cowork は、リント、テスト、コミットメッセージの検証などのカスタマイズされた hooks を生成できます。

プロンプト例

~/Projects/myapp/ にある JavaScript プロジェクトに Git hooks を設定したいです。以下を作成してください:

1. pre-commit hook:
   - ステージングされたファイルに ESLint を実行
   - Prettier フォーマットチェックを実行
   - console.log を含むコミットを防止

2. commit-msg hook:
   - Conventional Commit 形式を強制
   - チケット参照(PROJ-XXX)を必須化

3. pre-push hook:
   - 完全なテストスイートを実行
   - TODO/FIXME コメントをチェック
   - PR なしでの main へのプッシュを防止

hooks を .git/hooks/ に保存し、実行可能にしてください

Cowork の動作

  1. Hook 生成: 各 hook タイプのシェルスクリプトを作成します
  2. ツール統合: ESLint、Prettier、Jest と統合します
  3. パターンマッチング: コミット検証用の正規表現を設定します
  4. 権限設定: hooks を実行可能にします
  5. ドキュメント: 使用方法の説明を追加します

出力サンプル

#!/bin/sh
# .git/hooks/pre-commit

echo "pre-commit チェックを実行中..."

# ステージングされたファイルを取得
STAGED_FILES=$(git diff --cached --name-only --diff-filter=ACM | grep -E '\.(js|ts|jsx|tsx)$')

if [ -z "$STAGED_FILES" ]; then
    echo "チェック対象の JS/TS ファイルがありません"
    exit 0
fi

# console.log のチェック
echo "console.log 文をチェック中..."
if grep -n "console\.log" $STAGED_FILES; then
    echo "エラー: ステージングされたファイルに console.log が見つかりました"
    echo "削除するか、適切なロギングに置き換えてください"
    exit 1
fi

# ESLint を実行
echo "ESLint を実行中..."
npx eslint $STAGED_FILES
if [ $? -ne 0 ]; then
    echo "ESLint が失敗しました"
    exit 1
fi

# Prettier チェックを実行
echo "フォーマットをチェック中..."
npx prettier --check $STAGED_FILES
if [ $? -ne 0 ]; then
    echo "フォーマットの問題が見つかりました"
    echo "実行してください: npx prettier --write <files>"
    exit 1
fi

echo "pre-commit チェックに合格しました!"
exit 0
#!/bin/sh
# .git/hooks/commit-msg

COMMIT_MSG_FILE=$1
COMMIT_MSG=$(cat "$COMMIT_MSG_FILE")

# Conventional commit パターン
PATTERN="^(feat|fix|docs|style|refactor|test|chore|perf|ci|build|revert)(\([a-z-]+\))?: .+"

# チケット参照パターン
TICKET_PATTERN="PROJ-[0-9]+"

if ! echo "$COMMIT_MSG" | grep -qE "$PATTERN"; then
    echo "無効なコミットメッセージ形式です"
    echo ""
    echo "期待される形式: type(scope): description"
    echo "タイプ: feat, fix, docs, style, refactor, test, chore, perf, ci, build, revert"
    echo ""
    echo "例: feat(auth): add OAuth2 support PROJ-123"
    exit 1
fi

if ! echo "$COMMIT_MSG" | grep -qE "$TICKET_PATTERN"; then
    echo "チケット参照(PROJ-XXX)がありません"
    exit 1
fi

echo "コミットメッセージを検証しました"
exit 0
#!/bin/sh
# .git/hooks/pre-push

BRANCH=$(git rev-parse --abbrev-ref HEAD)

# main への直接プッシュを防止
if [ "$BRANCH" = "main" ]; then
    echo "main に直接プッシュできません"
    echo "代わりに PR を作成してください"
    exit 1
fi

# テストを実行
echo "テストを実行中..."
npm test
if [ $? -ne 0 ]; then
    echo "テストが失敗しました"
    exit 1
fi

# TODO/FIXME をチェック
echo "TODO/FIXME をチェック中..."
if git diff origin/main...HEAD | grep -E "TODO|FIXME"; then
    echo "警告: TODO/FIXME コメントが見つかりました"
    read -p "続行しますか? (y/n) " -n 1 -r
    echo
    if [[ ! $REPLY =~ ^[Yy]$ ]]; then
        exit 1
    fi
fi

echo "pre-push チェックに合格しました!"
exit 0

ヒント

  • より簡単な hook 管理には husky または lefthook を使用する
  • 緊急時のバイパス手順を含める
  • hooks は高速に保つ(遅いとフラストレーションの原因に)
  • npm 経由でチーム全体での hook 共有を検討する