26.

.gitignore が効かない原因と対処(既に追跡済ファイルを untrack する手順)

編集
この記事の要点
  • 最頻原因: そのファイルが 既に Git の追跡対象(tracked)になっている。.gitignore は未追跡ファイルにしか効かない
  • untrack の基本: git rm --cached でインデックスから外す(ワーキングツリーは残る)
  • 全ファイル untrack: git rm -r --cached .git add .git commit で .gitignore を反映し直す
  • 原因デバッグ: git check-ignore -v でどのルールが効いているか確認
  • 個人用無視: ~/.gitignore_global + core.excludesfile一時無視: git update-index --assume-unchanged

なぜ .gitignore が効かないのか

.gitignore に書いたのに、変更が git status に表示される」「コミット対象から外れない」という症状の 99% は同じ原因です:

.gitignore は「まだ Git に追跡されていない(untracked)ファイル」にしか効きません。 一度コミットしたファイルや git add 済のファイルは、.gitignore に追記しても無視されません。

Git の追跡状態は次の 3 つに分類されます:

状態説明.gitignore の効果
untrackedGit が知らないファイル効く(無視される)
tracked (committed)過去にコミット済効かない(追跡継続)
tracked (staged)git add 済効かない

原因の切り分け: git check-ignore

まずはそのファイルが どのルールにマッチしているか / そもそも追跡済かgit check-ignore で確認します:

# どのルールでマッチしているか表示(-v: verbose)
git check-ignore -v config/local.env
# 出力例:
# .gitignore:3:*.env    config/local.env
#   ↑ファイル  ↑行  ↑ルール  ↑対象

# マッチしない場合は何も表示されない → ルールが書けていない or 既に tracked

# 全候補を確認
git check-ignore -v -- *

# 追跡済か確認
git ls-files --error-unmatch config/local.env
# 0 で抜ければ tracked、エラーなら untracked

対処1: 既に追跡済ファイルを untrack する

最も多いケース。git rm --cachedインデックスから削除(ワーキングツリーのファイル自体は残る):

# 単一ファイル
git rm --cached config/local.env

# ディレクトリ単位
git rm -r --cached node_modules/
git rm -r --cached .idea/

# ワイルドカード
git rm --cached "*.log"

# コミット
git add .gitignore
git commit -m "Untrack files that should be ignored"

注意: git rm --cached はリモートで pull した他メンバーの環境からもそのファイルを削除します。.env 等の個人設定ファイルを untrack する場合は、事前にチームに周知すること。

対処2: 全ファイル untrack して再 add(リセット)

.gitignore を大幅に変更した、または「とりあえず全部 .gitignore を反映し直したい」場合の決定版:

# 1. 全ファイルをインデックスから一旦外す
git rm -r --cached .

# 2. .gitignore を効かせた状態で再追加
git add .

# 3. 差分を確認(無視対象だけが削除されているはず)
git status

# 4. コミット
git commit -m "Apply .gitignore"

これで .gitignore に新しく書いたパターンがすべて反映されます。

対処3: 書き方ミスをチェック

.gitignore の書き方には独特のルールがあります。よくある間違い:

書き方意味注意
*.log全階層の .log ファイルOK
/buildリポジトリ直下の build のみサブディレクトリの build は無視しない
build/全階層の build ディレクトリ末尾スラッシュ重要
!important.log除外を打ち消す親ディレクトリが無視されていると効かない
# commentコメント行頭のみ。行末 # は無効
BOM 付き .gitignoreUTF-8 BOM があるとパース失敗BOM なしで保存

対処4: グローバル .gitignore

.DS_Store / Thumbs.db / .idea/ など 個人環境特有のファイルは、プロジェクトの .gitignore ではなくホームの ~/.gitignore_global に書くのが行儀の良い運用:

# ~/.gitignore_global を作成
cat > ~/.gitignore_global <

対処5: 一時的に変更を無視する(assume-unchanged / skip-worktree)

tracked のままだが、ローカル変更を Git に見せたくない」ケース。config ファイルをローカルでだけ書き換えるときに便利:

# 変更を無視する(Git が「ファイル変わってない」とみなす)
git update-index --assume-unchanged config/database.yml

# 解除
git update-index --no-assume-unchanged config/database.yml

# 現在 assume-unchanged になっているファイル一覧
git ls-files -v | grep "^h "

# より強力: skip-worktree(pull で上書きもされない)
git update-index --skip-worktree config/database.yml

# 解除
git update-index --no-skip-worktree config/database.yml

注意: assume-unchanged / skip-worktree はローカル設定でリモートに伝わりません。チーム共有が必要な無視は .gitignore か .git/info/exclude を使うべき。

対処6: リポジトリローカルな無視 (.git/info/exclude)

「自分の作業環境だけ無視したい、でも .gitignore はチーム共有でいじりたくない」場合は .git/info/exclude:

# このリポジトリの自分の環境だけで無視
echo "scratch/" >> .git/info/exclude
echo "*.local" >> .git/info/exclude

# .git/ 配下なのでコミットされない

確認手順チートシート

# Step 1. そのファイルは tracked?
git ls-files | grep target.txt

# Step 2. .gitignore のどのルールに該当している?
git check-ignore -v target.txt

# Step 3. 何も該当しなければ .gitignore のパターンを見直し
cat .gitignore

# Step 4. tracked だった場合は untrack
git rm --cached target.txt
git commit -m "Untrack target.txt"

FAQ

Q: .env を間違ってコミットしてしまった
A: 履歴からも消したい場合は git filter-repo または BFG Repo-Cleaner。リモート push 済なら強制 push とシークレット失効処理が必須。

Q: サブディレクトリの .gitignore は効く?
A: 効きます。階層ごとに .gitignore を置けます。ルートのルールはサブにも継承されます。

Q: 否定ルール (!file) が効かない
A: 親ディレクトリが無視されていると子の否定は効きません。foo/!foo/important.txt は不可。foo/*!foo/important.txt なら可。

関連トピック

  • .gitattributes — 改行コードやマージ動作の指定
  • git clean -fdn — untracked ファイルの掃除(事前 dry-run)
  • git stash -u — untracked ファイルも含めて stash
編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. 用語一覧
  2. エラー一覧
  3. git本体のインストール(Linux)
  4. Linuxサーバーへのgit導入とクライアントのセットアップ
  5. リモートリポジトリをローカルリポジトリとしてクローンする方法
  6. リモートとローカルのリポジトリを同期(pull)する方法
  7. 設定の確認
  8. gitユーザー名とemailの設定
  9. リモートリポジトリの作成
  10. ローカルリポジトリの作成
  11. 新規ファイル/ディレクトリをインデックスに登録
  12. インデックスの登録状態を確認
  13. ローカルリポジトリの変更をコミット
  14. コミット履歴の確認
  15. クライアントからリモートリポジトリの接続設定、確認、削除
  16. リポジトリへのプッシュ
  17. リモートリポジトリからクライアントへのSSHクローン
  18. リモートとローカルの差分表示
  19. バージョンの確認
  20. プロキシの設定
  21. ローカルをリモートリポジトリの状態に戻す
  22. ブランチの作成, 一覧表示, 切り替え
  23. ブランチのマージと削除
  24. リベース
  25. .gitignoreの書き方
  26. .gitignoreの設定が反映されない場合
  27. 特定のファイルをgitの管理から外す方法
  28. 参照(ORIG_HEAD, HEAD, FETCH_HEAD)
  29. git rm [-r --cached] の取り消し
  30. 一部のディレクトリ/ファイルのみをリポジトリから復元する方法
  31. ローカルとリモートリポジトリの有無を同期
  32. pushの取消し方法
  33. マージツールの起動方法
  34. Gitで「MERGING」の状態a