Skip to content

fix(git): サンドボックス内 git push の credential 警告2件を抑制 - #303

Merged
tanimon merged 1 commit into
mainfrom
fix-nono-sandbox-git
Sep 4, 2026
Merged

fix(git): サンドボックス内 git push の credential 警告2件を抑制#303
tanimon merged 1 commit into
mainfrom
fix-nono-sandbox-git

Conversation

@tanimon

@tanimon tanimon commented Sep 4, 2026

Copy link
Copy Markdown
Owner

概要

Claude Code のネイティブサンドボックス内で git push / git fetch 等を実行すると、毎回 stderr に以下が出ていたのを抑制する。

warning: failed to probe 'http://localhost:<port>/' to detect provider
warning: Permission denied (localhost:<port>)
fatal: Could not create new item [0x186a1]

git 自体は成功し終了コードは 0 だが、毎回のノイズになっていた。

根本原因

サンドボックスは HTTP_PROXY=http://<user>:<pass>@localhost:<ランダムポート> を設定する。git はこのプロキシ認証を credential 機構経由で扱うため、通信成功後に credential approve を発行し、GCM が store で呼ばれる。そこで GCM が:

  1. ホストプロバイダ自動判定のため http://localhost:<port>/ をプローブ → サンドボックスが接続を拒否 → warning: Permission denied (localhost:<port>)
  2. Generic プロバイダとしてプロキシ資格情報を macOS キーチェーンへ保存 → サンドボックスが書き込みを拒否 → fatal: Could not create new item [0x186a1]

修正内容

credential.helper をラッパースクリプトに差し替え、ループバック宛(localhost / 127.0.0.1 / [::1]、ポート有無問わず)のリクエストだけ黙って捨て、それ以外は従来どおり GCM へ委譲する。

  • dot_config/git/executable_claude-code-credential-helper.sh(新規)
  • dot_config/git/claude-code.inccredential.helper を空値でリセットしてからラッパーを追加(多値キーなので、include で積まれた GCM と osxkeychain をリセットする必要がある)

なぜラッパーが必要か

credential.<url>.helper はポートを省略したパターンがポート付きホストにマッチしない(実測: credential.http://localhost.helper=host=localhost:63229 に効かない。完全一致のみ)。プロキシのポートはセッションごとに変わるため、静的な gitconfig の URL 指定では除外できない。

なお、そもそもセッション限りのプロキシ資格情報をキーチェーンに永続化する必要はないため、捨てて問題ない。

検証

対比ペア(同一セッション、GIT_CONFIG_GLOBAL のみ差し替え):

### WITH fix (claude-code.inc):
  (stderr 無音)
### WITHOUT fix (plain ~/.gitconfig):
  warning: failed to probe 'http://localhost:63906/' to detect provider
  warning: Permission denied (localhost:63906)
  warning: see https://aka.ms/gcm/autodetect for more information.
  fatal: Could not create new item [0x186a1]

ラッパー単体:

  • host=localhost:1 / host=127.0.0.1 への store → 無音・exit 0
  • host=github.com への get → GCM へ委譲され資格情報が返る

実際の git push(サンドボックス有効のまま): github.com への認証を伴うため GCM の store を通るが、stderr クリーン・exit 0。localhost 以外のホストでもキーチェーン警告が出ないことを確認済み。

その他: just lint exit 0 / chezmoi diff --source "$(pwd)" の差分は shfmt 整形分のみ。

チェックリスト

  • 後方互換性の確認 — 通常のインタラクティブなターミナルは GIT_CONFIG_GLOBAL が設定されないため影響なし
  • 静的解析(shellcheck / shfmt / secretlint / scan-sensitive)の通過確認
  • ドキュメント更新 — 経緯・理由はスクリプトと .inc のコメントに記載

マージ後の後始末(要手動)

この修正はもともと main に固定された chezmoi ソース worktree ~/.local/share/chezmoi に未コミットのまま置かれていた。本 PR で取り込んだので、マージ後にそちらを掃除する:

git -C ~/.local/share/chezmoi checkout -- dot_config/git/claude-code.inc
rm ~/.local/share/chezmoi/dot_config/git/executable_claude-code-credential-helper.sh
git -C ~/.local/share/chezmoi pull && chezmoi apply

両方消さないと git pull が拒否される。マージ前に実行すると次の apply で claude-code.inc が巻き戻り、いま効いている修正が無効化されるので順序に注意。

🤖 Generated with Claude Code

Claude Code のネイティブサンドボックス内で git push 等を実行すると、
HTTP プロキシ(localhost:<ランダムポート>)向けの credential store が
GCM 経由でキーチェーンに書き込もうとして失敗し、毎回 stderr に

  warning: failed to probe 'http://localhost:<port>/' to detect provider
  warning: Permission denied (localhost:<port>)
  fatal: Could not create new item [0x186a1]

が出ていた(git 自体は成功し終了コードは 0)。

credential.helper をラッパースクリプトに差し替え、ループバック宛の
リクエストだけ黙って捨てて、それ以外は従来どおり GCM へ委譲する。
credential.<url>.helper はポートを省略したパターンがポート付きホストに
マッチせず、プロキシのポートはセッションごとに変わるため、静的な
gitconfig の URL 指定では除外できない(実測)。

検証: 対比ペアで確認済み。ラッパー適用時は stderr 無音、
GIT_CONFIG_GLOBAL=~/.gitconfig で無効化すると上記3行が再現する。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@tanimon
tanimon merged commit df85c3e into main Sep 4, 2026
16 checks passed
@tanimon
tanimon deleted the fix-nono-sandbox-git branch September 4, 2026 06:34
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant