症状

.gitignore にファイルやディレクトリを追加したのに、git status で変更が検出され続ける。

結論:まずこれを確認

  1. そのファイルは すでに Git に追跡(track)されている 可能性が高い
  2. .gitignore新規ファイルにのみ有効 で、追跡済みファイルには効かない
  3. 追跡を解除するには 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 を確認する。

関連するトラブル

準備中

解決しない場合

    
ファイルへの書き込み権限を許可いただければ、保存できます。