.gitignore对已跟踪文件无效,须先执行git rm --cached移除跟踪,再确保规则正确并提交.gitignore;临时忽略可用git update-index --assume-unchanged,但仅限本地生效。

文件已被 Git 跟踪,.gitignore 不生效怎么办
这是最常踩的坑:你往 .gitignore 里加了 config/local.yml,但 git status 依然显示它被修改、能被 git add —— 因为 Git 已经在跟踪这个文件了。.gitignore 只对「未跟踪」的文件起作用。
必须先让 Git 停止跟踪它,再配合 .gitignore 才能真正“忽略”:
- 运行
git rm --cached config/local.yml(加--cached是关键,文件保留在本地) - 确认
config/local.yml已从暂存区移除:git status中不再出现该文件 - 确保
.gitignore里有对应规则,例如:config/local.yml或config/*.yml - 提交
.gitignore文件本身:git add .gitignore && git commit -m "ignore local config"
git update-index --assume-unchanged 适合什么场景
这个命令不改 Git 索引结构,只是告诉本地 Git “别管这个文件有没有变”,适用于临时跳过单个已跟踪文件的检测,比如你正在调试一个配置文件,又不想把它提交出去,但也不希望它从历史中消失。
- 执行
git update-index --assume-unchanged path/to/file.env - 之后
git status不会显示该文件的修改,git add也加不进去 - 想恢复跟踪?用
git update-index --no-assume-unchanged path/to/file.env - ⚠️ 注意:这个设置只存在你本地的
.git目录里,不会同步到远程,也不能被团队共享;换电脑或重装仓库就失效
.gitignore 规则写错导致忽略失败的典型表现
常见现象是:写了规则却仍看到文件出现在 git status,或者子目录下不该忽略的文件也被忽略了。
-
node_modules(没加斜杠)→ 会匹配文件名含node_modules的任意路径,比如src/mynode_modules.js -
/node_modules/(开头加/)→ 只忽略项目根目录下的node_modules/目录 -
**/log/→ 忽略所有层级的log/目录 -
!src/main.log→ 在通配规则后加!可以“反向排除”,但必须写在被它覆盖的规则之后 - 规则不生效?用
git check-ignore -v path/to/file查看哪条规则命中、为什么没命中
全局忽略和项目级忽略的区别与选择
有些文件你永远不想提交(比如 IDE 生成的 .vscode/、.idea/),但又不想每个项目都手动加一遍规则。
- 项目级:写进项目根目录的
.gitignore,会被提交,团队成员自动继承 - 全局级:配置
git config --global core.excludesfile ~/.gitignore_global,然后往里面写规则;只影响你本机,适合个人开发习惯(如忽略~/.zsh_history这类系统文件) -
.git/info/exclude:纯本地,不随项目传播,适合临时测试某条忽略规则是否合理
真正容易被忽略的是:规则写对了,但忘了 git rm --cached 这一步;或者用了 --assume-unchanged 却没意识到它无法跨环境迁移。Git 的忽略机制本质是「状态管理」,不是「魔法过滤器」——你得清楚当前文件处于「未跟踪」「已跟踪但忽略」「已跟踪且暂存」中的哪一种。











