AI業務活用 2026.04.24

Claude Codeのgit操作を安全にする設定集【force push防止・ブランチ保護・権限制限】

タグ:Claude / コード生成AI / 開発効率 / セキュリティ

Claude Codeがforce pushしかけた事例

Claude Codeはファイル操作だけでなく、ターミナルでGitコマンドを実行できます。これは強力な機能ですが、ある開発者がリベース操作を依頼した際に Claude Code が git push --force-with-lease origin main を実行しようとしたことが報告されています。

直前に git stashgit rebase が実行されていた場合、Claudeはコンフリクト解消の「自然な次のステップ」として強制プッシュを選択することがあります。実行前に確認ダイアログが出ますが、見落とす可能性があります。

3層防御で防ぐ

層1:ローカルGit設定でforce pushを禁止

# 特定のリポジトリでforce pushを禁止
git config receive.denyNonFastForwards true

# すべてのリポジトリにグローバル適用
git config --global alias.push-safe "push --no-force"

# mainブランチへの直接pushを自動でfeatureブランチに変換するhook
cat > .git/hooks/pre-push << 'EOF'
#!/bin/bash
current_branch=$(git branch --show-current)
if [ "$current_branch" = "main" ] || [ "$current_branch" = "master" ]; then
  echo "❌ mainブランチへの直接pushは禁止されています"
  echo "   feature ブランチを作成してPR経由でマージしてください"
  exit 1
fi
EOF
chmod +x .git/hooks/pre-push

層2:GitHubのブランチ保護ルール

GitHub の Settings → Branches → Branch protection rules で設定します:

ブランチ名パターン: main

チェックする項目:
✅ Require a pull request before merging
  ✅ Require approvals: 1
✅ Require status checks to pass before merging
✅ Require branches to be up to date before merging
✅ Do not allow bypassing the above settings
✅ Block force pushes
✅ Restrict deletions

GitHub CLI で設定する場合:

gh api repos/:owner/:repo/branches/main/protection \
  --method PUT \
  --field required_status_checks=null \
  --field enforce_admins=true \
  --field required_pull_request_reviews='{"required_approving_review_count":1}' \
  --field restrictions=null \
  --field allow_force_pushes=false \
  --field allow_deletions=false

層3:CLAUDE.mdでClaudeに明示する

プロジェクトルートの CLAUDE.md に以下を追加します:

## Git操作のルール(必ず守ること)

### 禁止操作(確認なしに実行してはいけない)
- `git push --force` または `git push --force-with-lease`
- `git reset --hard`(未コミットの変更を破棄する)
- `git rebase` の実行
- `main` または `master` ブランチへの直接push
- `git clean -f`(追跡されていないファイルを削除する)

### 許可された操作
- `git add``git commit`(新規コミットの作成)
- `git push` origin から feature ブランチへ(--forceなし)
- `git status``git log``git diff`(読み取りのみ)
- `git stash``git stash pop`

### 不明な場合の対応
上記に含まれない git 操作が必要な場合は、
コマンドを提案するだけにして、実際の実行はユーザーに任せること。

コミット履歴の管理

Claude Codeが書いたコードのコミットには Co-authored-by を追加しておくと、後から追跡しやすくなります:

# Claude Codeが生成・編集したコードをコミットするとき
git commit -m "feat: ユーザー認証機能を追加

Co-authored-by: Claude <claude@anthropic.com>"

または .gitmessage テンプレートに追記:

# Gitのコミットメッセージテンプレートを設定
cat > ~/.gitmessage << 'EOF'


# Co-authored-by: Claude <claude@anthropic.com>
EOF
git config --global commit.template ~/.gitmessage

Claude Codeへの権限制限

ファイルシステムへのアクセスを絞る場合:

# Gitコマンドの実行を禁止して、読み書きとテスト実行のみ許可
claude -p "src/auth/login.py のバグを修正して" \
  --allowedTools "Read,Edit,Write,Bash(pytest*)"
# 特定ディレクトリのみを操作対象にする
claude -p "src/utils/ のリファクタリングをして" \
  --allowedTools "Read(src/utils/**),Edit(src/utils/**)"

n8n・自動化ワークフローとの連携時の注意

Claude CodeをCI/CDやn8nなどの自動化ツールと連携する場合は、実行環境の権限を最小限にします:

# GitHub Actions: 読み取り専用トークンでClaudeを実行
- name: Claude Code レビュー
  env:
    ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
    GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}  # read-only
  run: |
    claude -p "このPRのコードをレビューして問題点を挙げて" \
      --allowedTools "Read" \
      --no-confirmation

あわせて読みたい

参考ソース