症状
.gitignore にファイルやディレクトリを追加したのに、git status で変更が検出され続ける。
結論:まずこれを確認
- そのファイルは すでに Git に追跡(track)されている 可能性が高い
.gitignoreは 新規ファイルにのみ有効 で、追跡済みファイルには効かない- 追跡を解除するには
git rm --cachedでキャッシュを削除する
操作フロー
flowchart TD
A[.gitignoreが効かない] --> B{対象ファイルは<br>すでに追跡されている?}
B -->|Yes| C[git rm --cached で<br>追跡を解除]
B -->|No| D{.gitignoreの<br>パターンは正しい?}
C --> E[変更をコミット]
D -->|Yes| F{.gitignoreの<br>文字コード・改行は正常?}
D -->|No| G[パターンを修正]
F -->|Yes| H[git check-ignore で確認]
F -->|No| I[UTF-8・LFで保存し直す]
G --> A
I --> A
H --> J{無視対象として<br>認識されている?}
J -->|Yes| C
J -->|No| G
よくある原因
- すでに追跡済み:
.gitignoreに追加する前にコミットしたファイルは、追跡が継続される - パターンの書き方が間違っている:
/の有無、*の使い方で挙動が変わる - ファイル名のタイポ:
.gitignore自体のファイル名や、中のパターンにタイポがある - 文字コードの問題: BOM付きUTF-8やWindows改行(CRLF)で正しく認識されない
- グローバル gitignore との競合:
~/.gitignore_globalの設定が影響している場合がある - サブディレクトリの .gitignore: 親ディレクトリの設定が子で上書きされている
- 否定パターンの誤用:
!で除外を解除しているつもりが効いていない
操作手順
ステップ1: 対象ファイルが追跡されているか確認する
git ls-files ファイル名
🔍 チェックポイント: ファイル名が表示されれば「追跡済み」。何も表示されなければ「未追跡」
ステップ2: .gitignore のパターンが正しいか確認する
git check-ignore -v ファイル名
🔍 チェックポイント: パターンがマッチしていれば、どの .gitignore のどの行でマッチしたか表示される。何も表示されなければパターンが間違っている
出力例(マッチしている場合):
.gitignore:3:*.log debug.log
ステップ3: 追跡済みファイルのキャッシュを削除する
単一ファイルの場合:
git rm --cached ファイル名
ディレクトリ全体の場合:
git rm --cached -r ディレクトリ名/
🔍 チェックポイント: git status で対象ファイルが「deleted」として表示される(実際のファイルは削除されない)
ステップ4: 全ファイルのキャッシュを一括で再構築する
多数のファイルがある場合や、確実に反映させたい場合:
git rm -r --cached .
git add .
🔍 チェックポイント: .gitignore に記載したファイルが git status に表示されなくなる
ステップ5: 変更をコミットする
git status
git commit -m "chore: update .gitignore and remove cached files"
🔍 チェックポイント: コミット後、対象ファイルを編集しても git status に表示されない
ステップ6: .gitignore の書き方を確認する
よく使うパターン:
# 特定のファイル
secret.txt
# 特定の拡張子(すべてのディレクトリ)
*.log
# 特定のディレクトリ配下すべて
node_modules/
# ルートディレクトリ直下のみ
/config.local.json
# 特定パターンを除外から復活させる
!important.log
NG行動
git rmを--cachedなしで実行する: ワーキングディレクトリからファイルが削除される- 確認せずに
git rm -r --cached .を実行する: 意図しないファイルがステージングされる可能性がある .gitignoreを編集しただけでコミットしない: 他の開発者に反映されない- 機密ファイルを
.gitignoreに追加して安心する: 過去のコミット履歴には残っているため、履歴からも削除が必要
⚠️ 警告: 機密情報(APIキー、パスワード等)が過去にコミットされている場合、.gitignore に追加しても履歴には残る。git filter-branch や BFG Repo-Cleaner での履歴削除を検討する。
よくある質問(FAQ)
Q1: git rm --cached でファイルは削除される?
A: ワーキングディレクトリのファイルは削除されない。Git のインデックス(追跡対象リスト)から削除されるだけ。--cached を付け忘れると実ファイルも削除されるので注意。
Q2: 全員の環境で .gitignore を反映させるには?
A: .gitignore の変更とキャッシュ削除をコミットしてプッシュする。他のメンバーがプルすれば反映される。ただし、各自のローカルで追跡済みのファイルは、各自が git rm --cached を実行する必要がある場合もある。
Q3: グローバルな .gitignore はどこにある?
A: 以下のコマンドで確認できる:
git config --global core.excludesfile
設定されていない場合は ~/.gitignore_global や ~/.config/git/ignore を確認する。
関連するトラブル
準備中
解決しない場合
- Git 公式ドキュメント - gitignore
- GitHub - Ignoring files
- 確認すべきファイル:
.gitignore、.git/info/exclude、グローバル gitignore - 次に調べるキーワード:
git filter-branch、BFG Repo-Cleaner、git履歴から削除
ファイルへの書き込み権限を許可いただければ、保存できます。