git worktree でデプロイしたら .env のコピーを頼まれた日:未コミット変更の判断と pnpm generate 失敗からの出し直し
git worktree でデプロイしたら .env のコピーを頼まれた日
.env を別フォルダへコピーしてほしい。
記事を書き終えてコミットとデプロイを頼んだら、Claude Code からそう頼み返された。
いつものデプロイで、そんな手順を踏んだ覚えはない。
この日は公開記事を2本書き、そのうち1本を本番まで出した。 デプロイは2回走らせ、2回目で完走した。
朝のうちに片付けた小さな依頼
- 06:11 ある経営者が挙げた愛読書3冊の邦題を調べてもらった。3冊とも日本語訳が出ていた。
- 06:21 画像に写っていた外国語の文章(画像生成AI向けのプロンプト)を、日本語に訳して書き起こしてもらった。
- 07:11 アプリをリリースするときの参考にしたいニュース記事を、非公開のメモとしてまとめてもらった。途中で出典の媒体名の誤りが見つかり、直してから保存した。
Meta の Muse を公開記事にする
発端は、海外の投稿者の論考を貼り付けたことだった。 Meta が新しく出した AI エージェント Muse についての論考である。
Claude Code に公式リリース(Muse の発表と Meta Connect 2026)を調べさせ、Meta のニュースルームにあるグラス発表ページから、画像と Muse 関連の記述を抜き出してもらった。 キーホルダー型デバイス Muse Charm の画像は、ニュースルームにあるかを検索させた。 Engadget に載っていた写真は、クレジットが「Meta」の公式写真だった。
作業の途中で、記事とは別の質問を1つ挟んだ。 「狂った創業者」がいて、配る経路(流通網)も持っている会社は Meta のほかにあるのか、という趣旨である。 Meta 以外にもあるが、米国の中で探すと候補はイーロン・マスクくらい、という答えだった。
本文を書き終えたあと、事実関係の食い違いを直させ、lint と表示確認に進ませた。 記事には公式リリースから取った画像6枚を入れた。 Chrome で PC 幅とスマホ幅の両方を開き、画像の読み込み失敗、はみ出し、太字の崩れがないことを確かめた。
→ Meta はなぜ Muse をタダで配るのか:36億人の流通網にAIエージェントを載せる賭け
コミット済みの内容だけを出すための別フォルダ
コミットとデプロイを頼むと、Claude Code は「コミット済みの内容だけを出す方法」で進めると言った。 元のフォルダには、別セッションが残した未コミットの変更がある。 連結精算表のファイル、記事2本、新しいページなどだ。 いつもの手順だと、それらもまとめて本番に出てしまう。
そこで git worktree で別フォルダを作らせ、依存パッケージを入れさせた。 インストールは47秒で正常に終わった。
引っかかったのは .env だった。
デプロイの途中で、R2 の資格情報や OGP の署名キーといった秘密の値を使う。
ところが Claude Code 側では .env の読み取りもコピーも権限で止められていて、中身を見ない形のコピーでも拒否された。
それで、cp の2行を私が貼って実行してほしい、という依頼が来た。
いつもはどうしていたのか
依頼を読んで、まず話に連結精算表が出てきたことが気になった。 別のリポジトリの変更まで混ざっているのかと思い、聞き返した。 デプロイ先は mdx-playground で合っていて、連結精算表は mdx-playground の中にある未コミットのファイルを指していた。
次に、いつものデプロイでこんな操作はしていないはずだと思い、いつもはどうしていたのかを聞いた。
いつもは元のフォルダで /deploy をそのまま実行していて、そこにある .env をスクリプトが直接読んでいた。
別フォルダを作ったのは今回だけで、その回避策のせいで .env のコピーという手順が1つ増えていた。
そうなると、別フォルダが本当に要るのかが怪しくなる。 別セッションの変更は、本番に出てはいけないものなのか。 一緒に出てかまわないのではないかと考え、中身を確かめさせた。 本番に出て困る変更はなく、どれも別のセッションが作業を終えてコミットだけしていない状態に見える、という結果だった。
それならいつもどおりでいい。
y と返して、デプロイを始めてもらった。
作業用の別フォルダは、デプロイと並行して片付けに回した。
git の登録は外せた。
ただ、フォルダの実体は再帰削除のガード(Git_repo 直下のフォルダを丸ごとは消させない仕組み)に止められ、Claude Code からは消せなかった。
最後に私が rm -rf を1行打って消した。
1回目は本番に出る前の検査で止まった
デプロイは Production 向けで動き出した。 完了まで12〜20分の見込みだった。 プリレンダーの対象ページ3,016件の登録まで進み、7,005ページのプリレンダーが446秒で終わった。
その直後に pnpm generate が失敗した。
本番にはまだ何も反映されていなかった。
原因は、前日の Mac 版 Muse の記事にあった。 この記事は非公開フォルダにあるのに、非公開の印が付いていなかった。 非公開フォルダの70本のうち、印がないのはこの1本だけだった。 ビルド後の検査はこの印を見て公開かどうかを決めるので、「公開記事なのにブログ一覧のカレンダーに出ていない」と判定し、デプロイを止めていた。
unpublished: true # 足りなかった非公開の印
記事に印を付け、検査が通ることを確かめてから、Issue を残してコミットし、デプロイをやり直してもらった。 失敗した時点ではまだ deploy-lock を取っていなかったので、ロックの解除は要らなかった。
2回目で完走した
2回目も Production 向けで始まり、プリレンダーは406秒で終わった。
1回目に止まった postgenerate の検査は、最後のステップ(strip-content-dump)まで通った。
R2 への画像アップロードと wrangler による本番への反映は、そのまま済んだ。 直後のヘルスチェック1回目では、まだ前のビルドが配信されていた。 スクリプトが自動で再試行し、重要ページのチェックが通った。 JavaScript ファイル1,373件の配信、ブログ一覧の9月表示、payload のチェックもすべて通り、デプロイは15.1分で完走した。 最後に、記事が本番で画像込みで表示されるかを実際に開いて確かめてもらった。
手元とリモートはそろっていたか
片付けが済んだあと、mdx-playground のリポジトリがリモートと一致しているのかが気になった。 なぜデプロイ用のフォルダができていたのかも聞きかけて、worktree を作ったからだと思い当たった。
git fetch で確かめさせると、手元が3コミット先に進んでいて、リモートにしかないコミットは0件だった。
3つは前日の日記、今回の記事、非公開の印の修正である。
push を頼み、手元の master とリモートの master がそろった。
AI投資はインフレの主因なのか
昼前には、別の問いから公開記事を1本作った。 世界中でインフレになっている。 戦争の影響もあるが、そもそも AI への設備投資が今年に入って大きく伸びている。 設備投資が増えれば、世界は基本的にインフレに向かうのではないか。 そう Claude Code に聞いた。
返ってきた結論は、今のインフレの主因は原油で、AI投資は物価を押し上げてはいるが効き方は局所的、というものだった。 米国の8月の消費者物価は前年比3.4%だった。 食品とエネルギーを除いたコア指数は2.4%にとどまり、差の約1ポイントはほぼエネルギー価格で説明がつく。
これを公開記事にまとめてもらった。 既存記事の形式を確認させ、公開記事にするので数字をもう一段確かめさせた。 推敲のあと lint と機械チェックを走らせ、dev 環境で表示を確かめた。 このセッションの時点では、コミットと本番デプロイはまだだった。
→ 2026年のインフレはAI投資のせいなのか。米国の物価統計で原油高と切り分ける
午後に PC の側面を撮る前に
14:14、PC の側面を写真で調べる話を思い出した。 撮影のあいだに関連する非公開のメモを読んでおいてもらい、写真で確かめたい点を3つ挙げてもらった。
振り返り
- 別フォルダ(worktree)は、コミット済みの内容だけを出す手段としては筋が通っていた。ただ、いつもの
/deployは元のフォルダの.envを読む前提なので、別フォルダでは.envのコピーが1手増える。別セッションの変更を本番に出してよいかを先に確かめれば、別フォルダが要るかどうかをその場で判断できた。 - ビルド後の検査は、置き場所のフォルダではなく frontmatter の印で公開かどうかを見る。非公開フォルダに置いても、
unpublished: trueを付け忘れた1本がデプロイを止めた。