◉ANTIGRAVITY LABEN
記事一覧/連携・プラグイン
⬡ 連携・プラグイン/2026-10-26中級

トークンを remote URL に埋め込む運用をやめました。古いクローンの .git/config に、誰でも読める権限で残っていました

無人で git を動かすとき、トークンを remote URL に入れていないかを棚卸しし、http.extraheader に移す手順です。点検スクリプト 3 本の全文と、移行前後に実際に出た出力を載せました。

Antigravity400Git12認証情報無人実行8bash5個人開発119

✦ プレミアム記事

エージェントに渡すリポジトリを取得し直そうとして、いつもの手順が止まりました。表示されたのは detected dubious ownership の一行です。

所有者の食い違いそのものは、別の記事に書いたとおり、書ける場所へ逃がせば片づきます。この記事で書き残すのは、その切り分けの途中で見つけた、もう一つのことです。

先に結論をお伝えします。アクセストークンを remote URL に埋め込むと、その値は .git/config という平文のファイルに残ります。そして、そのファイルの権限は、クローンを作ったときの umask 次第で、同じ共有領域の他のユーザーに読める状態になります。 私の古いクローンは、まさにその状態でした。

引っ越しの手順と、実際に動かした出力を、順に書きます。

止まった原因を探していて、別のものが出てきました

古いクローンは、共有の一時領域に、別のユーザー名義で残っていました。ls で確かめると、次のとおりです。

$ ls -ld /tmp/repos/antigravitylab.net
drwxr-xr-x 7 nobody nogroup 4096 Oct 26 04:56 /tmp/repos/antigravitylab.net
$ stat -c '%U:%G %a %n' /tmp/repos/antigravitylab.net/.git/config
nobody:nogroup 644 /tmp/repos/antigravitylab.net/.git/config

所有者は nobody です。私の uid ではないので、git status は拒否されるはずでした。ここで私は、よくある回避策を先に打ちました。

git config --global --add safe.directory '*'

すると git status は通り、「Your branch is up to date」と返しました。ところが、次の書き込みで落ちます。

error: could not lock config file .git/config: Permission denied
fatal: could not set 'remote.origin.url' to ...
error: cannot open .git/FETCH_HEAD: Permission denied

safe.directory が消してくれるのは Git の拒否だけで、ファイルシステムの権限は変わりません。読み取りは通り、書き込みだけが落ちます。表示だけ緑になって、最初の書き込みで初めて赤くなるので、無人で動かしていると原因の位置を取り違えやすいと感じました。

この点は、前の記事の続きにあたります。ここから先が、今回の本題です。

正直に言うと、このとき私は「動いたのだから、もう大丈夫だろう」と感じかけていました。緑の表示は、安心を先に連れてきてしまうものだと気づいたのは、このあとです。

.git/config に何が入っているかを数えました

書き換えられないなら、せめて中身を確かめようと思いました。読むだけなら通ります。ただし、値は画面にもログにも出したくありません。そこで、値を読まずに「資格情報の形をした行が何行あるか」だけを数える点検スクリプトを書きました。

#!/usr/bin/env bash
# audit_remote_creds.sh <親ディレクトリ>...  資格情報入りの remote URL を持つクローンと、その config の権限を一覧する
# 資格情報そのものは出力しない。終了コード: 0=なし / 1=あり
FOUND=0
for ROOT in "$@"; do
  for CFG in "$ROOT"/*/.git/config; do
    [ -f "$CFG" ] || continue
    # https://<何か>@host の形だけを数える(値は読まず、行数だけ得る)
    N=$(grep -cE 'url *= *https://[^/@ ]+@' "$CFG")
    [ "$N" -gt 0 ] || continue
    MODE=$(stat -c '%a' "$CFG"); OWN=$(stat -c '%U' "$CFG")
    # 'others' の読み取りビット(4)が立っているか
    if [ $((8#$MODE & 4)) -ne 0 ]; then WORLD="world-readable"; else WORLD="private"; fi
    echo "CRED $CFG owner=$OWN mode=$MODE $WORLD"
    FOUND=1
  done
done
exit $FOUND

grep -c は一致した行の数しか返さないので、値は画面に出ません。stat の権限の下位 3 ビットを見れば、他のユーザーに読めるかどうかも分かります。

私のクローン置き場に当てた結果です。

$ ./audit_remote_creds.sh /tmp/repos $HOME/repos
CRED /tmp/repos/antigravitylab.net/.git/config owner=nobody mode=644 world-readable
rc=1

1 件ありました。mode=644 は、所有者以外にも読めるという意味です。 この領域に他のユーザーがいる限り、トークンを読める状態だったことになります。読まれた形跡は確認できていませんし、確認する手段も私にはありません。だからこそ、「読まれていない」とは言い切らず、入れ替える前提で動くことにしました。

✦

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
✦自分のクローンの .git/config に認証情報が残っていないかを、値を表示せずに 1 コマンドで棚卸しできるようになります
✦remote URL 埋め込み方式から http.extraheader 方式へ、既存のクローンを壊さずに移せるようになります
✦他人の所有で書き換えられない古いクローンを見つけたとき、触らずに退避して、トークンを入れ替える判断ができるようになります
Stripe による安全な決済 · いつでもキャンセル可能
✦

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Antigravity Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • ✦コピー&ペーストで使える実装コード付き
  • ✦毎日新しい上級ガイドを追加
  • ✦¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

関連記事

◈ Agents & Manager2026-10-25
空き容量 11MB で無人ジョブが止まりました。du が数えたのは 59MB だけで、残りの約 9GB は見えない場所にありました
エージェントを無人で走らせる前に、書き込み先の空きを測って止める bash スクリプト 2 本の全文です。du と df の数字が噛み合わない理由と、自分では片付けられない空き不足の見分け方も書きました。
⬡ 連携・プラグイン2026-08-03
サーバーごとに秒数を書く前に測ったこと — MCP の接続と呼び出しは 486 倍違っていました
2.4.3 で MCP サーバーごとにタイムアウトの秒数を指定できるようになりました。何秒が妥当かを決めるために stdio サーバーを自作して境界別に実測し、単一の値では覆えない理由と、いま設定に書いている値の決め方をまとめます。
⬡ 連携・プラグイン2026-05-28
Antigravity Background Agent に App Store スクリーンショットの多言語更新を4本のアプリで5週間任せた所感
壁紙アプリ4本のスクリーンショット更新を Antigravity Background Agent に5週間任せ、英・中・韓・スペイン語を含む8ロケールぶんを継続生成した運用記録です。手直しを18件から2件に減らした文字幅バリデーションの実装まで含めて共有します。