Git ignore 不生效:先分清已跟踪文件和忽略规则

10-01 4阅读

把 local.conf 写进 .gitignore 后,git status 仍显示它被修改,通常不是规则缓存坏了。忽略规则主要决定哪些未跟踪路径不再自动进入版本控制,已经在索引中的文件仍会参与比较。本文使用 Git 2.28 及以上和 Bash,在全新临时仓库演练,不触碰现有项目,也不修改全局配置。

Git ignore 不生效:先分清已跟踪文件和忽略规则

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 可能根本不遍历那个目录。规则应配合实际路径逐条验证,避免过宽模式隐藏应提交的源码。

本地保留与历史清除是两件事

移出索引不会改写旧提交,历史版本中原来存在的内容仍可读取。若误提交的是密钥,添加忽略规则不能撤回泄露,必须走凭据撤销与历史处理流程。本文只处理虚构配置,不把忽略功能当作安全存储。发布前也应检查构建、打包和部署流程是否会把本地文件另行复制出去。

同事拉取删除提交时,原来跟踪的副本可能随更新被移除,已有本地修改则可能导致更新受阻。团队迁移前应说明如何备份本地配置,并提供不含敏感值的配置模板。最终验收同时看仓库是否停止跟踪、忽略规则是否命中、本地文件是否保留以及其他环境如何重建必要配置。

参考资料

文章版权声明:除非注明,否则均为云鹊BLOG原创文章,转载或复制请以超链接形式并注明出处。