.gitignore对已跟踪文件无效,因它仅忽略未跟踪文件;需先用git rm --cached取消跟踪,再提交才生效,且规则须置于Git仓库根目录。

文件写了 .gitignore 还是被提交?大概率它早被 Git 跟踪过了,规则根本不起作用。
为什么 .gitignore 对某些文件完全没反应
Git 只忽略「从未被跟踪」的文件。一旦执行过 git add .vscode 或该文件出现在某次 git commit 里,.gitignore 就彻底失效——这是最常卡住人的地方。
- 检查是否已被跟踪:
git ls-files --cached --error-unmatch .vscode,如果返回路径,说明已跟踪 - 取消跟踪(不删本地文件):
git rm -r --cached .vscode - 之后再提交一次,让 Git 知道这个目录现在该被忽略了
- 批量误提交场景下慎用
git rm -r --cached . && git add .,它会重置整个暂存区
规则写在哪儿才真正生效
.gitignore 必须放在 Git 仓库根目录,不是 VSCode 当前打开的文件夹。很多人在 src/ 里开 VSCode,却把 .gitignore 放在 src/ 下,Git 根本读不到。
- 确认 Git 根路径:
git rev-parse --show-toplevel - 多根工作区?每个根目录都要单独配一份
.gitignore - 想全局忽略编辑器临时文件(如
*.swp、.vscode/),走git config --global core.excludesfile ~/.gitignore_global - 项目级规则优先级高于全局,但
.git/info/exclude优先级最高(仅当前仓库,不提交)
常见路径写法陷阱
斜杠位置、通配符层级、否定顺序,错一个字符就匹配失败。
-
/dist/:只匹配 Git 根目录下的dist/目录 -
dist/:匹配任意层级叫dist的目录(比如src/dist/也会被忽略) -
**/*.log:匹配所有深度的.log文件;旧版 Git 不稳定,推荐**/前缀写法 - 先写
*.log,再写!important.log才能放行;反过来就无效 -
.vscode/后面加斜杠,表示忽略目录本身;不加可能误伤my.vscode.config这类文件
VSCode 里怎么验证规则到底有没有生效
别靠眼睛看“文件没出现在源代码管理面板”就以为成功了——得让 Git 自己说。
- 查哪些文件正被 ignore:
git ls-files -i --exclude-standard - 查单个文件被哪条规则拦下:
git check-ignore -v .vscode/settings.json,输出第一列就是命中规则的文件路径 - VSCode 集成终端里运行这些命令,比靠插件提示更可靠
- 注意:
git status显示 “deleted: .vscode/xxx” 是因为你刚git rm --cached了,不是忽略失败——要再git commit一次才真正“消失”
真正麻烦的从来不是写规则,而是搞清当前文件到底是「未跟踪」「已缓存」「已提交」中的哪一种状态。Git 不会自动回退跟踪状态,你得亲手把它从索引里摘出来,否则 .gitignore 就是一张废纸。


















