.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
.gitignoreが効くのは未追跡ファイルだけ。追跡済みはgit rm -r --cached パスで解除してからコミット- どのルールに当たっているかは
git check-ignore -v ファイル名で1発特定 - PowerShellの
echo > .gitignoreはUTF-16で保存されGitが読めない。UTF-8で保存し直す
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/**/*.pdf | doc 配下の全階層の PDF |
!keep.log | 除外の取り消し。ただし親ディレクトリごと除外されていると無効 |
プロジェクト種別ごとの定番パターンは.gitignore生成ツールで Node.js / Python / Unity などを選ぶだけで生成できます。手書きより抜け漏れがありません。
3. 原因3: ファイル自体の問題(Windowsで頻出)/ File encoding traps
- UTF-16で保存されている: PowerShell 5.x の
echo "node_modules" > .gitignoreは UTF-16LEで保存され、Gitはルールを1行も読めません。VS Code等で開きUTF-8(BOMなし)で保存し直してください。 - ファイル名が
.gitignore.txt: 拡張子非表示設定のWindowsで起きがち。dirやlsで正確な名前を確認。 - 見えない文字の混入: コピペ由来のBOMやゼロ幅スペースが行頭にあるとパターンが一致しません。Unicode Inspectorに貼ると不可視文字を可視化できます。
4. 原因4: 書く場所・優先順位 / Location and precedence
除外ルールは複数箇所に書け、より近い階層が優先されます。
リポジトリ各階層の .gitignore- チームで共有する標準の場所.git/info/exclude- 自分だけ・このリポジトリだけ(コミットされない)core.excludesFile(例:~/.gitignore_global)- 自分の全リポジトリ共通(OSやエディタの一時ファイル向け)
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
- .gitignore Generator - 言語・フレームワーク別の定番パターンを生成
- Unicode Inspector - 不可視文字・BOMの検出
- Diff Checker