TL;DR: kung hindi gumagana ang .gitignore, naka-track na halos laging ang file. Ang mga file na hindi pa nakikita ng Git lang ang ini-ignore nito — immune sa kahit anong rule na isusulat mo ang file sa index. Hanapan ng katotohanan gamit ang git check-ignore -v <path>: ang tahimik na output ay nangangahulugang naka-track ang path at walang tumutugmang rule. Ayusin gamit ang git rm --cached <path>, mag-commit, at magsisimulang gumana ang ignore rule mula sa commit na iyon paabante. Ang ayos ng mga rule, mga bitag sa negation, at mga pulang herring ng VS Code ang nagpapaliwanag ng natitirang mga kaso.
Bakit hindi gumagana ang .gitignore?
Isang mekanismo ang sumasaklaw sa karamihan ng mga kaso: nai-commit ang file bago pa umiral ang rule. Hindi filter ang .gitignore na nagtatago ng mga file sa git — rule ito tungkol sa kung ano ang sasaluhin ng git add mula sa untracked na estado. Kapag nasa index na ang file, habambuhay na sinusubaybayan ng git ang mga pagbabago sa content nito hangga’t hindi mo ito hayagang ina-untrack. Walang binabago ang pag-edit ng .gitignore pagkatapos ng pangyayari tungkol sa mga tracked file — kaya ang klasikong sequence na “i-commit ang .env, mag-panic, idagdag ang .env sa .gitignore, mag-commit ulit” ay nagpapadala pa rin ng secret sa bawat push.
Kagat ito sa lahat dahil halos unibersal ang git — sa Stack Overflow 2022 survey, lagpas 93% ng mga propesyonal na developer ang gumagamit ng Git (survey.stackoverflow.co) — at ang bawat isa sa mga developer na iyon ay sa kalaunan magsusulat ng rule para sa file na nai-commit nila noong nakaraang linggo.
Sinasaklaw ng natitira ng post na ito ang mga minority na kaso: mga pagkakamali sa ayos ng rule, mga bitag sa negation, mga edge case ng folder, at ang tanong sa IDE. Pero i-run muna ang health check sa susunod na seksyon — higit sa siyam sa sampu, doon natatapos ang imbestigasyon.
Paano ko tiyakin kung aling gitignore rule ang tumutugma sa file?
Ang git check-ignore ang diagnostic tool, at ang katahimikan nito ang diagnostic:
# Prints the matching rule + file + line number when a rule applies
git check-ignore -v debug.log
# .gitignore:3:*.log debug.log
# Prints NOTHING when no rule applies — the file is tracked (or no rule exists)
git check-ignore -v src/.env
# (silence = .gitignore is not ignoring this path, whatever you wrote)
# Exit codes: 0 = ignored, 1 = not ignored — scriptable
git check-ignore -q debug.log && echo "ignored" || echo "tracked or unruly" Pagbasa ng output ng -v: ang ignore source (.gitignore, .git/info/exclude, o ang global ignore file mo), tapos line-number:pattern, tapos ang path. Kapag nagulat ka sa isang mas huling rule, tandaan ang precedence: ang huling tumugmang rule ang panalo, kaya ang !important.log pagkatapos ng *.log ay muling isinasama ang iyon lang na file.
Bakit hindi gumagana ang gitignore sa mga file na nai-commit na?
I-untrack ang file, panatilihin sa disk, i-commit ang pag-alis:
# Untrack one file (the local copy survives — --cached touches the index only)
git rm --cached .env
git commit -m "stop tracking .env"
# Verify the ignore rule now applies
git check-ignore -v .env Mula sa commit na ito paabante, pag-aari na ng .gitignore ang path: hindi na lumalabas sa git status ang mga pag-edit dito, at hindi na ito sasaluhin muli ng git add .. Nasa history pa rin ang file noon — kung secret ito, hindi sapat ang pag-alis dito sa pinakabagong commit. Ang pag-rotate ng credential ang tanging totoong fix; kosmetiko ang muling pagsulat ng history (at tumutulong lang ang pagbawi sa huling commit habang masamang commit pa rin ang tip).
Para sa repo na puno ng mga dati pang nai-commit na kalat — build output, mga dumi ng editor, node_modules na nakapasok nang maaga — ang bulk untrack ay dalawang linya:
git rm -r --cached .
git add .
git commit -m "apply .gitignore to tracked files" Binubuo muli nito ang index laban sa kasalukuyang mga rule: lumalabas ang mga ignored na path, muling idinaragdag nang walang pagbabago ang lahat ng iba. Dramatiko ang itsura ng diff (libu-libong pagbura) pero walang binubura sa disk. Kung ang goal mo ay burahin ang mga file na iyon sa halip na i-untrack lang, teritoryo na ng git clean -fdx iyan — tingnan ang git remove untracked files, nang ligtas.
Ini-ignore ng Git ang mga file na hindi pa nito nakikita. Ang file na nasa index na ay immune sa
.gitignore— walang rule na isusulat mo ang magpapabulag ulit dito.
Bakit hindi gumagana ang gitignore sa isang folder?
Tatlong bitag na ukol sa folder:
1. Mahalaga ang trailing slash sa intensyon, hindi sa tugma. Parehong tumutugma sa directory ang build at build/, pero idinokumento ng build/ na directory lang ang ibig mong sabihin — isang file na pinangalanang build ay liligtas dito. Bumibigo naman ang symmetry sa muling pagsasama (susunod na bitag).
2. Hindi kayang sagipin ng negation ang mga file sa loob ng naka-exclude na directory. Malinaw ang git docs: “Hindi posibleng muling isama ang isang file kung ang isang parent directory ng file na iyon ay naka-exclude” (git-scm.com/docs/gitignore). Desisyon ito sa performance — buo ang laktaw ng git sa mga naka-exclude na directory sa halip na lakarin ang mga ito. Kaya hindi gumagana ito:
build/
!build/keep.me # dead rule — git never looks inside build/ Ang fix ay i-exclude ang mga nilalaman, hindi ang directory:
build/*
!build/keep.me # works — build/ itself is still open for inspection 3. Panalo sa sarili nitong saklaw ang mga nested na .gitignore file. Nilalampasan ng mga rule sa subdir/.gitignore ang root file para sa mga path sa ilalim ng subdir. Kapag binanggit ng git check-ignore -v ang ignore source na hindi mo inaasahan, karaniwang ito ang dahilan.
Bakit hindi gumagana ang gitignore sa VS Code?
Halos hindi kailanman dahil sa VS Code. Binabasa ng Source Control view ng editor ang parehong index na binabasa ng git, kaya pareho ang sintomas: nai-commit na ang file, at walang pag-restart ng IDE ang magbabago sa index. Dalawang VS Code-katabing katotohanan ang worth malaman:
- Abuhay sa Explorer = ignored; orange/dilaw = tracked na may mga pagbabago. Ang file na lumilitaw na modified pagkatapos mong i-ignore ito ang kumpirmasyon mo na naka-track ito — i-run ang
git rm --cachedfix sa itaas. - Ang pagkawala ng naka-
.gitignorena file sa changed list ng Explorer ay nangangahulugang gumagana ang rule — hindi ito kailanman lumilitaw bilang untracked file simula pa. Madalas ireport ng mga tao ang “binabalewala ng VS Code ang gitignore ko” kapag hindi sang-ayon ang CLIgit statussa lumang SCM view; i-reload ang window (Cmd/Ctrl+Shift+P→ “Reload Window”) bago mo sisihin ang git.
.gitignore vs .git/info/exclude vs global: alin kailan?
| File | Saklaw | Naka-commit? | Gamitin para sa |
|---|---|---|---|
.gitignore (repo) | Lahat ng nag-cclone | Oo | Build output, dependencies, .env — mga shared rule |
.git/info/exclude | Clone mo lang | Hindi | Personal na kalat: .scratch/, mga dumi ng editor |
core.excludesFile (global) | Lahat ng repo mo | Hindi | Kalat ng OS: .DS_Store, Thumbs.db, *.swp |
.gitignore + negation | Repo | Oo | Muling pagsasama ng mga eksepsiyon sa tracked config |
Ang global file ang hindi kailanman itinatakda ng karamihan ng developer at dapat:
git config --global core.excludesFile ~/.gitignore_global
printf '.DS_Store\nThumbs.db\n*.swp\n' >> ~/.gitignore_global House rule na worth kopyahin: kapag nakikinabang ang buong team sa rule, nasa repo ito; kapag ikaw lang ang nakikinabang, nasa exclude o sa global file ito. Ang pag-commit ng mga personal na ignore rule ang dahilan kung bakit umaabot sa 300 linya ang mga .gitignore file at walang nakakaalam kung aling kalahati pa ang mahalaga.
Paano ko i-ignore ang mga pagbabago sa tracked file?
Minsan gusto mo ang isang tracked file (config template, IDE settings file) pero gusto mong tumigil sa paglabas sa git status ang mga lokal na edit. Dalawang flag sa git update-index, walang alinman na kabilang sa team workflow:
git update-index --skip-worktree config/local.dev # local edits go quiet
git update-index --no-skip-worktree config/local.dev # ...and back Ang --skip-worktree ang maipagtatanggol — sinasabi nitong “sadyang nagkakalayo ang local version ko.” Ang pinsan nitong --assume-unchanged ay pangako sa performance (“hindi magbabago ang file na ito”), hindi ignore mechanism, at maaari itong tahimik na baliin ng git. Parehong umiiyak nang malakas ang dalawang flag sa pull kapag binago rin ng upstream ang file — ang matatagal na mga sagot ay local-only na config sa pamamagitan ng exclude sa pagkagawa, o template file (config.example) na sinusubaybayan ng git at kinokopya mo.
Ang 30-segundong gitignore health check
git check-ignore -v <path> # which rule? (silence = tracked, no rule)
git ls-files --error-unmatch <path> # is it tracked at all?
git rm --cached <path> # untrack, keep on disk
git commit -m "stop tracking <path>"
git check-ignore -v <path> # rule now shows I-diagnose, i-untrack, i-verify. Ang pattern sa likod ng bawat “gitignore not working” report ay iisang file na suot-suot ang dalawang sumbrero — tracked sa isang gilid ng index, ignored sa kabila — at isang --cached flag ang nagtatanggal sa ikalawang sumbrero.
FAQ
Bakit hindi gumagana ang .gitignore?
Sa karamihan ng mga kaso, naka-track na ang file. Mga untracked file lang ang ini-ignore ng Git; immune sa .gitignore ang nasa index hanggang i-untrack mo ito gamit ang git rm --cached at mag-commit.
Paano ko tiyakin kung aling gitignore rule ang tumutugma sa isang file?
I-run ang git check-ignore -v <path>. Nililimbag nito ang eksaktong linya ng .gitignore at bilang ng rule, o tahimik na lumalabas kapag naka-track ang file at walang tumutugmang rule.
Binubura ba ng git rm --cached ang local file ko?
Hindi. Inaalis lang ng --cached ang file mula sa index; nananatili ang kopya sa disk. I-commit ang pag-alis at magiging untracked ang file — mula noon, naaangkop na ang .gitignore.
Bakit hindi muling maisama ng gitignore ang file sa loob ng ignored na folder?
Buo ang laktaw ng Git sa mga naka-exclude na directory para sa performance. Ayon sa git docs, imposible muling isama ang file kung ang isang parent directory nito ay naka-exclude.
— mrsaynothing
— mrsaynothing
Mga field note sa AI, Linux at self-hosting.
Pag-usapan ang post na ito sa dev.to dev.to ↗
Ang susunod na how-to sa email
Isang email kada post. Ayusin, tuloy sa susunod.
ano ito?Hindi Gumagamit ng GPU ang Ollama? Ayusin sa Linux, Windows at WSL
Nag-e-enjoy ka ba sa mga sulat na ito? Ito ang tinatayo ko para sa trabaho. i-hire ako