AI手帖

.gitignoreに.envを書いても残る?手元を残して追跡だけ外す方法

すでに追跡されている.envは、.gitignoreに書くだけでは外れません。追跡だけを外して手元に残すコマンドは git rm --cached -- .env です。過去のコミット履歴は、この操作では消えません。

この記事の流れ

追跡済みの.envだけを外す

リポジトリのルート直下にある .env を追跡から外すには、次を使います。

git rm --cached -- .env

--cached により、手元のファイルを残してインデックス(次のコミットの準備場所)から外します。.gitignore にも .env の無視ルールを用意します。

追跡されているか分からない場合は、先に次を確認します。

git ls-files -- .env

.env と出れば対象です。何も出なければ、現在のインデックスには入っていません。その場合は追跡解除をせず、git check-ignore -v -- .env で無視ルールを調べます。

追跡済みのファイルは通常の check-ignore に出ないため、ルールだけ確認したいときは git check-ignore -v --no-index -- .env を使います。表示されたルールが ! で始まる場合は、無視を取り消す指定です。

手元・インデックス・履歴で、何が変わるか

同じ .env でも、置かれている場所は三つあります。--cached が変更するのはインデックスです。

順序・状態手元の.envインデックス過去のコミット
未追跡の.envに無視ルールを設定残る追加されない記録していない
.envをコミットした後で無視ルールを追加残る残る残る
その.envをgit rm --cachedで外す残る外れる残る
追跡解除をコミットした後残る外れている以前のコミットには残る

この表は架空ファイルで実行した結果です。自分の環境で現在未追跡だったとしても、過去に一度もコミットしていないとは判断できません。

削除表示が出ても、手元から消えたとは限らない

操作後は、次のように追跡状態とファイル名だけを確認できます。.env の値は表示しません。

git ls-files -- .env
git diff --cached --name-status -- .env .gitignore
git check-ignore -v -- .env

ls-files が空になり、手元のファイルは残り、無視ルールが合っていれば、追跡解除の準備ができています。.gitignore の変更も含め、意図したファイルだけがコミット候補になっているか確認します。

以前コミットした .env なら、差分に D .env と出る場合があります。これは次のコミットから削除する準備で、手元のファイルの削除を意味しません。初回の git add だけを取り消した場合は、同じ表示にはなりません。

エラーになったら、強制指定を足さずに未コミットの変更とステージ状態を確認します。共同開発では、削除を含むコミットをほかの人が取り込む際の影響も確認します。

履歴や、公開済みのキーは別に扱う

追跡解除をコミットしても、それ以前のコミットには当時の内容が残ります。本物のキーを外部へ公開・送信した場合は、キーの無効化と交換を先に行います。履歴を消すだけでは、取得済みの値を回収できません。APIキーの保管と漏えい時の対処も確認してください。

また、.gitignore はGitの無視ルールです。ディスクにあるファイルを、AIツールなどから読めなくする共通のアクセス制御ではありません。読み取りの制限には、そのツールや実行環境の設定を使います。

検証範囲と再現ファイル

2026年10月21日JSTに、AIアシスタントがLinuxの一時リポジトリ2つを使い、Git 2.39.5・Python 3.11.2で確認しました。使用した値は API_KEY=DUMMY_NOT_A_SECRET だけです。

確認したのはGitコマンドとファイル・インデックス・履歴の状態です。GUI表示、リモートへのpush、履歴書き換え、実キーの交換、共同開発者がpullしたときの動作は試していません。

入力・実行結果・コマンドの記録

架空ファイルで同じ挙動を確認したい場合は、検証資料ZIPを使えます。実行コードは一時リポジトリを作る検証用で、手元の実プロジェクトを書き換えるものではありません。

参照した公式資料と検証記録

確認日:2026年10月24日。