DevToolBox

.gitignoreが効かない時の原因と対処

.gitignore に書いたのに git status に出続ける・コミットされてしまう場合、 原因の9割は「そのファイルが既に追跡済み(tracked)」です。 残りはパターンの書き方ミスと、Windows特有の文字コードの罠です。上から順に確認してください。

If Git keeps showing files you listed in .gitignore, they are almost certainly already tracked. This guide covers git rm --cached, check-ignore debugging, pattern rules, and encoding traps.

TL;DR

1. 原因1: 既に追跡済み(最頻出)/ Already tracked

.gitignore は「これから追跡を始めない」指定であり、一度コミットしたファイルの追跡は止まりません。追跡を外すには:

# ファイルはローカルに残し、Gitの追跡だけ外す
git rm -r --cached node_modules
git rm --cached .env

# .gitignore に該当パターンがあることを確認してからコミット
git commit -m "stop tracking ignored files"

注意: このコミットを pull した他のメンバーの作業ツリーからは実ファイルが削除されますnode_modules やビルド成果物のように各自が再生成できるものであることを確認してから実行してください。.env のような秘密情報を誤ってコミットしていた場合は、追跡解除だけでなく履歴からの削除とキーのローテーションも必要です。

2. 原因2: パターンが当たっていない / Pattern mistakes

まず git check-ignore -v で「どのファイルのどの行が効いているか」を確認します。何も出力されなければパターンが当たっていません。

git check-ignore -v dist/main.js
# .gitignore:3:dist/   dist/main.js  ← 3行目の dist/ が効いている
書き方 / Pattern意味 / Meaning
buildどの階層の build も対象(ファイルもディレクトリも)
build/ディレクトリのみ対象(同名ファイルは対象外)
/build.gitignoreと同じ階層の build だけ(深い階層は対象外)
*.log全階層の .log ファイル
doc/**/*.pdfdoc 配下の全階層の PDF
!keep.log除外の取り消し。ただし親ディレクトリごと除外されていると無効

プロジェクト種別ごとの定番パターンは.gitignore生成ツールで Node.js / Python / Unity などを選ぶだけで生成できます。手書きより抜け漏れがありません。

3. 原因3: ファイル自体の問題(Windowsで頻出)/ File encoding traps

4. 原因4: 書く場所・優先順位 / Location and precedence

除外ルールは複数箇所に書け、より近い階層が優先されます。

5. English summary

.gitignore only affects untracked files. If a file keeps appearing, it is already tracked — rungit rm -r --cached pathand commit (local files stay; collaborators' copies are removed on pull). Use git check-ignore -v file to see exactly which rule matches, and review pattern semantics: build/ matches directories only, /build anchors to the .gitignore location, and !negation cannot resurrect files inside an excluded directory. On Windows, PowerShell redirection writes UTF-16 files Git cannot parse — save as UTF-8 without BOM. Rules can also live in .git/info/exclude (personal, per-repo) and the global core.excludesFile.

関連ツール / Related tools

関連ガイド / Related guides