Git ignore 不生效:先分清已跟踪文件和忽略规则
把 local.conf 写进 .gitignore 后,git status 仍显示它被修改,通常不是规则缓存坏了。忽略规则主要决定哪些未跟踪路径不再自动进入版本控制,已经在索引中的文件仍会参与比较。本文使用 Git 2.28 及以上和 Bash,在全新临时仓库演练,不触碰现有项目,也不修改全局配置。
AI生成概念配图:文件从提交轨道移入本地文件夹,并由忽略规则控制后续纳入。仅作概念说明,不代表实际界面或实测结果。
先复现,再判断文件属于哪一层
下列脚本先提交一个虚构配置,再添加忽略规则并修改工作区内容。所有身份设置仅保存在临时仓库。最后退出括号内的子 shell 时会清理演练目录;如果希望观察中间状态,可以先逐段执行并保留该目录。示例配置没有密码或真实服务地址。
( set -eu work=$(mktemp -d) trap 'rm -rf -- "$work"' EXIT cd -- "$work" git init -q -b main git config user.name 'Tutorial' git config user.email 'tutorial@example.invalid' printf 'mode=demo\n' > local.conf git add -- local.conf git commit -qm 'track demo config' printf '/local.conf\n' > .gitignore printf 'mode=local\n' > local.conf git status --short git ls-files --error-unmatch -- local.conf git check-ignore -v --no-index -- local.conf git rm --cached -- local.conf git add -- .gitignore test -f local.conf git diff --cached --stat git diff --cached -- .gitignore local.conf git commit -qm 'keep demo config local' git status --short --ignored git check-ignore -v -- local.conf printf 'local content: ' cat -- local.conf )
第一次状态检查应显示配置修改以及新建的忽略文件。ls-files 能找到该路径,说明它仍被跟踪。带 no-index 的 check-ignore 展示假如不考虑索引时会命中的规则;这能把“规则写错了”和“规则命中但文件已跟踪”区分开。不要把没有输出一律解释成忽略文件未读取。
只移出需要的路径,不重建整个索引
git rm 的 cached 选项只从索引移除路径,当前工作区文件保留。随后暂存并提交 .gitignore,新提交中该配置不再存在;最后的状态输出会以两个感叹号标识被忽略的本地文件,内容仍是修改后的值。观察暂存差异非常关键,因为索引中的删除是真实的下一次提交内容。
真实项目应先检查工作区和暂存区已有变更,再决定哪些路径允许退出版本控制。不要直接套用清空全部缓存再全部添加的配方,否则无关改动也可能混进来。若命令拒绝操作,应阅读提示并保存需要的内容,不要习惯性加 force。目录可以定点递归处理,但应先审查完整成员范围。
团队规则与个人规则放在不同位置
项目生成物的通用规则通常放进仓库里的 .gitignore,随提交共享。只属于自己工作习惯的临时文件,可使用该仓库的 info/exclude;跨项目的编辑器备份规则则有全局排除文件入口。不同来源具有优先级,同一层级中后匹配的规则可覆盖前面的规则,排查时应保留详细规则来源。
本文在仓库根目录写 /local.conf,用开头斜杠限定该层路径。没有斜杠的模式可能影响更深目录;结尾斜杠通常限定目录。若整个父目录已被排除,单独写一条否定规则未必能重新纳入里面的文件,因为 Git 可能根本不遍历那个目录。规则应配合实际路径逐条验证,避免过宽模式隐藏应提交的源码。
本地保留与历史清除是两件事
移出索引不会改写旧提交,历史版本中原来存在的内容仍可读取。若误提交的是密钥,添加忽略规则不能撤回泄露,必须走凭据撤销与历史处理流程。本文只处理虚构配置,不把忽略功能当作安全存储。发布前也应检查构建、打包和部署流程是否会把本地文件另行复制出去。
同事拉取删除提交时,原来跟踪的副本可能随更新被移除,已有本地修改则可能导致更新受阻。团队迁移前应说明如何备份本地配置,并提供不含敏感值的配置模板。最终验收同时看仓库是否停止跟踪、忽略规则是否命中、本地文件是否保留以及其他环境如何重建必要配置。


