Claude Code で git push --force を禁止する deny 設定
Claude Code が誤って git push --force や git push -f を実行しないよう、settings.json の permissions.deny で禁止する書き方と、書き方の揺れ(-f、--force-with-lease)への対処、動作確認の方法を解説します。
Claude Code に Git 操作を任せていると、コンフリクトの解消中に git push --force を実行されて、他の人のコミットが消える事故が起こり得ます。これを防ぐには、settings.json の permissions.deny に force push のパターンを書いておきます。
結論として、次の 4 行をプロジェクトの .claude/settings.json に入れておけば、Claude Code は force push を実行できなくなります。
KEY POINT
この記事で分かること
- force push を禁止する deny の書き方
-fや--force-with-leaseなど表記の揺れへの対処- 設定が効いているかの確認方法
設定例
{
"permissions": {
"deny": [
"Bash(git push --force:*)",
"Bash(git push -f:*)",
"Bash(git push --force-with-lease:*)",
"Bash(git push * --force:*)"
]
}
}
Bash(パターン:*) は、コマンド文字列がそのパターンで始まるものすべてを対象にします。git push --force:* は git push --force origin main のような形に一致します。
用語解説
deny の優先順位: deny は allow と ask より常に優先されます。プロジェクトの settings.json に書いた deny は、個人の settings.local.json で Bash(git push:*) を allow にしていても解除されません。チームで守りたいルールはプロジェクト側の deny に書きます。
表記の揺れに対応する
前方一致なので、オプションの順序が変わると一致しません。よく使われる形を列挙しておきます。
| 形 | 一致させるパターン |
|---|---|
git push --force origin main | Bash(git push --force:*) |
git push -f origin main | Bash(git push -f:*) |
git push origin main --force | Bash(git push * --force:*) |
git push --force-with-lease | Bash(git push --force-with-lease:*) |
--force-with-lease は通常の --force より安全ですが、リモートの状態を上書きする点は同じです。チームの方針で許可する場合は、この行だけ ask に移してください。
deny は保険であって壁ではない
cd repo && git push --force や、シェルスクリプト経由の実行は先頭が変わるため一致しません。本当に守りたいブランチは、GitHub のブランチ保護ルール(force push の禁止)をリモート側で設定してください。deny はローカルでの事故を減らす保険です。
動作を確認する
- 設定を保存し、Claude Code を起動(または再起動)します。
/permissionsを実行し、deny の一覧に追加した 4 行が表示されることを確認します。- Claude に「テスト用に
git push --force origin test-branchを実行して」と頼みます。 - 実行が拒否され、その旨が表示されれば成功です。
関連する設定
force push 以外にも、git reset --hard や git checkout -- . のように作業内容を失う操作は同じ方法で禁止できます。
{
"permissions": {
"deny": [
"Bash(git reset --hard:*)",
"Bash(git checkout -- .:*)",
"Bash(git clean -f:*)"
]
}
}
permissions 全体の設計(allow / ask / deny の使い分け、スコープの優先順位)は、親記事の settings.json で permissions を設計する を参照してください。git push 自体を毎回確認させたい場合は git push だけ毎回確認させる ask 設定 で扱っています。
まとめ
.claude/settings.jsonのpermissions.denyにBash(git push --force:*)などの 4 行を書く- deny は前方一致なので、
-f、--force-with-lease、オプション順の違いを個別に書く - deny は allow より常に優先され、個人設定で解除できない
- 確実に守るにはリモートのブランチ保護を併用する
よくある質問
- deny に書いたコマンドは Claude が別の書き方で回避することはありますか?
- あります。deny は前方一致なので、-f や --force-with-lease のような別表記は個別に書く必要があります。確実に守りたい場合はリモート側のブランチ保護も併用してください。
- 個人の設定で deny を上書きして許可できますか?
- できません。deny は allow より常に優先され、プロジェクトの settings.json に書いた deny は settings.local.json の allow で解除できません。
参考にした一次情報
この記事は公式ドキュメントを基に AI が下書きを作成し、運営者が内容を確認して公開しています。誤りを見つけた場合はお問い合わせからお知らせください。