Claude Code は、デフォルトで起動時の git status の結果をシステムプロンプトに取り込みます。この記事では、その取り込みを止める設定と、さらに ~/.claude.json にリポジトリ情報を記録させたくない場合の回避策を記します。
要点
Claude Code は、デフォルトで起動時の git status の結果をシステムプロンプトに取り込みます。これを止めたい (git status の結果を勝手に判断材料として使ってほしくない) 場合は、settings.json に "includeGitInstructions": false を記入するか、環境変数 CLAUDE_CODE_DISABLE_GIT_INSTRUCTIONS=1 を設定します。
なお、deny 設定で git コマンド実行を禁止していたとしてもこれらの設定が必要です。
ただし、上記の設定だけでは ~/.claude.json の "githubRepoPaths" への記録は止まりません。そこまで避けるなら、Claude Code 起動時だけ .git/ を退避する方法があります。
git status の取り込みを止める方法
システムプロンプトに git status の結果が取り込まれるのを防ぐには、スコープの settings.json に次のように書きます。
{
"includeGitInstructions": false
}
または、環境変数として次を設定します (こちらが優先)。
export CLAUDE_CODE_DISABLE_GIT_INSTRUCTIONS=1
deny 設定だけでは取り込みが止まらない理由
settings.json で "deny": ["Bash(git:*)"] していればよいのでは、と思うかもしれませんが、これだけでは取り込みを防げません。git status の実行主体は AI エージェントでなく Claude 本体 (ハーネス) であり、権限設定が及ばないためです。
~/.claude.json に記録されるリポジトリ情報
git status の取り込みを止めてもなお、Claude Code はワークルートが GitHub リポジトリかどうかを確認します。確認された結果は、状態ストアファイル ~/.claude.json の "githubRepoPaths" キーに記録されます。つまり、「このワークルートはこのリポジトリである」という対応関係が保存されます。
このキーの中身を手動で削除しても、Claude Code を起動すると再び記録されます。記録を止めたい場合は、起動時だけ .git/ を別名に退避し、起動後に戻す方法があります。
Claude Code 起動時のみ .git/ を退避するラッパー関数
- このラッパー関数は、10 秒間
.git/を.abc/にリネームします。Claude 起動時に git 操作をフックしているとか、リネームの影響がある場合は使えません。 - そのように使用に注意が必要な割に、何か効果があるわけではない (はず) です。AI エージェントに Git の情報を隠蔽したいなら、
"includeGitInstructions": falseとし、エージェントから git まわりの権限を奪っておけば足りるはずです。~/.claude.json経由でリポジトリが漏洩するリスク (そんなリスクがあるかは不明) まで潰したい人とか、少しでも余計な情報を記録させたくない人向けです。
以下のラッパー関数を ~/.bashrc や ~/.zshrc に書いておくと、claude 実行時に .git/ を .abc/ に退避し、10 秒後に戻します。
_claude_run() {
local hid=0
[ -e .git ] && { mv .git .abc && hid=1; }
[ "$hid" = 1 ] && ( sleep 10; mv .abc .git ) &
command claude "$@"
}
claude() {
_claude_run "$@"
}
これにより、Claude Code 起動時のリポジトリ判定を回避し、~/.claude.json にワークルートと GitHub リポジトリの対応を記録させずに済みます。
(参考) 起動ディレクトリ確認との併用
ちなみに、別の記事で意図しないディレクトリでの Claude Code 起動を防ぐラッパー関数を書いていましたが、.git/ 退避と併用できます。
_claude_run() {
local hid=0
[ -e .git ] && { mv .git .abc && hid=1; }
[ "$hid" = 1 ] && ( sleep 10; mv .abc .git ) &
command claude "$@"
}
claude_allowed_dirs=(
# Claude Code 許可ディレクトリをここに書いておく
"${HOME}/aaa"
"${HOME}/bbb/ccc"
)
claude() {
local current_dir
current_dir=$(pwd)
for dir in "${claude_allowed_dirs[@]}"; do
[ "$current_dir" = "$dir" ] && { _claude_run "$@"; return; }
done
echo 'このディレクトリでは Claude Code の起動が想定されていません'
read -p '本当に続行しますか? (y/n): ' ans
[ "$ans" = 'y' ] || { echo '中止します'; return; }
_claude_run "$@"
}
この対応を入れた経緯
- Claude Code エージェントに作業を依頼したら、意図しない判断をされ、理由を問うと「
git statusの結果にこうあったので」などと許可していないgitコマンドの結果を持ち出してきたので、デフォルトでgit status結果が注入される仕様を知りました (最近ディレクトリ構成を変更するまで Claude Code 起動ルートが Git リポジトリではなかったので知りませんでした)。git statusの結果を勝手に判断材料に入れてほしくないので、"includeGitInstructions": falseとCLAUDE_CODE_DISABLE_GIT_INSTRUCTIONS=1を導入しました。 - それでも
~/.claude.jsonへのリポジトリ情報の記録が止まらなかったので、リポジトリ情報のスキャンを防ぐラッパー関数も導入しました。