この記事の要点
-
.gitignoreに.envと1行書いただけでは、.env.local・.env.bak・.env~・prod.envなどは無視されません。git 2.47.3 で、ダミー値のファイル10個を置いて確かめました。 -
/.envと先頭にスラッシュを付けると、backend/.envのようなサブフォルダの.envも無視されなくなります(公式の「先頭か途中に / があると、その .gitignore の階層からの相対パスになる」のとおり)。 - 今回の10個をすべて止めて
.env.exampleだけ残せたのは、次の3行でした。
.env*
*.env
!.env.example
- 無視されていない env 系ファイルは、次の1行で一覧できます。
git ls-files --others --exclude-standard | grep -i env
ファイル名だけで .env や鍵の置き場所を点検する CLI も作っています(今回の確認では .env.bak は表示され、.env~ と prod.env は表示されませんでした。対応は Issue にしています)。
npx github:supportapp3-lab/ai-secret-check scan
試した内容
使い捨てのリポジトリに、次の10個のファイル(中身はすべて API_KEY=dummy-not-real)を置きました(Debian の box、git 2.47.3)。
.env .env.local .env.bak .env~ .env.old env.bak .env.example
backend/.env backend/.env.production config/prod.env
.gitignore を1パターンずつ書き換えて、git status --short --untracked-files=all で「無視されずに残ったファイル」(?? の行)を見ました。
パターン別の結果
.env
?? .env.bak
?? .env.example
?? .env.local
?? .env.old
?? .env~
?? backend/.env.production
?? config/prod.env
?? env.bak
無視されたのは .env と backend/.env だけです。.env というパターンは名前が .env のファイルにしか当たらないので、.env.local もバックアップの .env.bak・.env~ も、AI エージェントに git add -A を任せればそのまま入ります。
/.env
?? .env.bak
?? .env.example
?? .env.local
?? .env.old
?? .env~
?? backend/.env
?? backend/.env.production
?? config/prod.env
?? env.bak
backend/.env まで残りました。公式の gitignore に「If there is a separator at the beginning or middle (or both) of the pattern, then the pattern is relative to the directory level of the particular .gitignore file itself」とあり、先頭の / で一番上の階層だけに限られたためです。モノレポや backend/・frontend/ に分けた構成では注意が必要です。
.env*
?? config/prod.env
?? env.bak
.env で始まる名前はすべて無視されました。ただし .env.example も無視されるので、見本ファイルをコミットしたいなら !.env.example を足す必要があります。
.env.*
?? .env
?? .env~
?? backend/.env
?? config/prod.env
?? env.bak
. の後ろに何か続くものだけに当たるので、.env 本体と .env~ が残りました。.env.* だけを書く場合は .env の行も必要です。
*.env
?? .env.bak
?? .env.example
?? .env.local
?? .env.old
?? .env~
?? backend/.env.production
?? env.bak
prod.env は無視されましたが、.env.local などは残りました。
組み合わせ
$ cat .gitignore
.env*
*.env
!.env.example
$ git status --short --untracked-files=all
?? .env.example
?? .gitignore
?? env.bak
$ git check-ignore -v .env.bak backend/.env.production config/prod.env .env.example
.gitignore:1:.env* .env.bak
.gitignore:1:.env* backend/.env.production
.gitignore:2:*.env config/prod.env
.gitignore:3:!.env.example .env.example
-
env.bak(先頭に.がない)はどのパターンにも当たりませんでした。名前の付け方がばらばらなら、パターンを増やすより、後で紹介する洗い出しの1行で見るほうが確実です。 -
git check-ignore -vは、どの行に当たったかを表示します。!で始まる行に当たったときは「無視されない」という意味です(git-check-ignore の -v)。
無視されていない env 系ファイルを洗い出す
.gitignore を .env 1行に戻した状態で実行しました。
$ git ls-files --others --exclude-standard | grep -iE 'env'
.env.bak
.env.example
.env.local
.env.old
.env~
backend/.env.production
config/prod.env
env.bak
--others は追跡していないファイル、--exclude-standard は .gitignore などの無視ルールを効かせる指定です(git-ls-files)。ここに出たものは、次の git add -A で入ります。environment.ts のように名前に env を含むだけのファイルも出るので、目で見て判断してください。
すでに追跡されている .env には .gitignore が効かない点は、前回の記事で確かめています。
まとめ
.gitignore |
無視されなかったもの(今回の10個のうち) |
|---|---|
.env |
.env.local・.env.bak・.env~・prod.env など8個 |
/.env |
上に加えて backend/.env(9個) |
.env* |
prod.env・env.bak(.env.example も無視される) |
.env.* |
.env 本体・.env~ など5個 |
*.env |
.env.local・.env.bak など7個 |
.env* + *.env + !.env.example
|
env.bak だけ(.env.example は残る) |
参考
- gitignore(PATTERN FORMAT)
- git-check-ignore(-v)
- git-ls-files(--others / --exclude-standard)
- 関連する筆者の記事: .gitignore に .env を書いても、追跡中の .env はコミットされ続ける
※ 仕様は 2026-11-01 時点の公式ドキュメントに基づきます。動作は git 2.47.3 の使い捨てリポジトリで、ダミー値だけを使って試しました。
更新情報やちょっとしたTipsは X(@supportapp3_lab)で発信しています。