AI業務活用 2026.04.24
Claude Codeのgit操作を安全にする設定集【force push防止・ブランチ保護・権限制限】
Claude Codeがforce pushしかけた事例
Claude Codeはファイル操作だけでなく、ターミナルでGitコマンドを実行できます。これは強力な機能ですが、ある開発者がリベース操作を依頼した際に Claude Code が git push --force-with-lease origin main を実行しようとしたことが報告されています。
直前に git stash や git 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