如何让 Git 停止跟踪已加入 .gitignore 的文件
文件被跟踪后加入 .gitignore 不生效,需先移出索引:git rm --cached <文件>(目录加 -r),提交后 gitignore 规则才接管。本地文件不受影响,只是 Git 不再跟踪其变化。
核心动作:git rm --cached <文件> 把它移出 Git 索引(本地文件保留),提交这次"删除"后,.gitignore 的规则才真正生效。 只加 gitignore 不移索引是没用的——Git 对已跟踪文件永远优先看索引。
操作步骤
# 1. 确保 .gitignore 里已有该文件规则
echo "config.local.json" >> .gitignore
# 2. 移出索引(--cached = 不动磁盘文件)
git rm --cached config.local.json
git rm -r --cached build/ # 目录加 -r
# 3. 提交
git commit -m "停止跟踪本地配置文件"
git push
批量处理所有"应忽略却被跟踪"的文件
git rm -r --cached . # 全部移出索引
git add . # 按 gitignore 重新添加(被忽略的不会进来)
git commit -m "清理索引,对齐 gitignore"
这条组合在"项目初期忘了配 gitignore、提交了一堆垃圾"后一键治理很好用。
队友侧的效果
他们 pull 后,该文件在他们机器上也会被"停止跟踪"——但本地文件会被删除(对 Git 来说这是一次删除提交)。提醒队友提前备份自己那份本地配置。
常见问题(FAQ)
Q:--cached 会删本地文件吗?
不会。它只操作索引;不加 --cached 的 git rm 才连文件一起删。
Q:历史提交里的旧版本怎么办?
停止跟踪只影响之后。历史里的旧内容仍在仓库中(含敏感信息的话需要用 git filter-repo 重写历史并作废凭据)。
Q:想让 Git 忽略已跟踪文件的本地改动、但不从索引删除?
那是另一个需求:git update-index --skip-worktree <文件>。与 gitignore 场景别混淆。