⚙️ 自動化
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 の動作
- Hook 生成: 各 hook タイプのシェルスクリプトを作成します
- ツール統合: ESLint、Prettier、Jest と統合します
- パターンマッチング: コミット検証用の正規表現を設定します
- 権限設定: hooks を実行可能にします
- ドキュメント: 使用方法の説明を追加します
出力サンプル
#!/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 共有を検討する