Claude Code で git push --force を禁止する deny 設定

Claude Code 公開:

Claude Code が誤って git push --force や git push -f を実行しないよう、settings.json の permissions.deny で禁止する書き方と、書き方の揺れ(-f、--force-with-lease)への対処、動作確認の方法を解説します。

検証日 2026年9月7日 仕様変更が早い分野です。最新の公式ドキュメントも併せてご確認ください。
目次
  1. 設定例
  2. 表記の揺れに対応する
  3. 動作を確認する
  4. 関連する設定
  5. まとめ

Claude Code に Git 操作を任せていると、コンフリクトの解消中に git push --force を実行されて、他の人のコミットが消える事故が起こり得ます。これを防ぐには、settings.jsonpermissions.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.jsonBash(git push:*) を allow にしていても解除されません。チームで守りたいルールはプロジェクト側の deny に書きます。

表記の揺れに対応する

前方一致なので、オプションの順序が変わると一致しません。よく使われる形を列挙しておきます。

一致させるパターン
git push --force origin mainBash(git push --force:*)
git push -f origin mainBash(git push -f:*)
git push origin main --forceBash(git push * --force:*)
git push --force-with-leaseBash(git push --force-with-lease:*)

--force-with-lease は通常の --force より安全ですが、リモートの状態を上書きする点は同じです。チームの方針で許可する場合は、この行だけ ask に移してください。

deny は保険であって壁ではない

cd repo && git push --force や、シェルスクリプト経由の実行は先頭が変わるため一致しません。本当に守りたいブランチは、GitHub のブランチ保護ルール(force push の禁止)をリモート側で設定してください。deny はローカルでの事故を減らす保険です。

動作を確認する

  1. 設定を保存し、Claude Code を起動(または再起動)します。
  2. /permissions を実行し、deny の一覧に追加した 4 行が表示されることを確認します。
  3. Claude に「テスト用に git push --force origin test-branch を実行して」と頼みます。
  4. 実行が拒否され、その旨が表示されれば成功です。

関連する設定

force push 以外にも、git reset --hardgit 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.jsonpermissions.denyBash(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 が下書きを作成し、運営者が内容を確認して公開しています。誤りを見つけた場合はお問い合わせからお知らせください。