用 .gitignore 忽略已提交的文件
说明如何用 git rm --cached 让加入 .gitignore 后仍被跟踪的文件取消跟踪、如何找出匹配忽略规则的已跟踪文件,以及机密信息被提交后的处理顺序。
这是最常见的问题。.gitignore 只作用于尚未被跟踪的文件。 已经提交过一次的文件,即使添加了规则,仍会持续显示变更。要停止跟踪,就必须把文件从索引(暂存区)中移除。
单个文件或单个目录
# 1) 在 .gitignore 中添加规则(例如 .env, dist/)
# 2) 只从索引中移除 — 工作目录中的实际文件保持不变
git rm --cached .env
git rm -r --cached dist/
# 3) 提交
git commit -m "Stop tracking .env and dist"
关键在于 --cached。没有这个选项,git rm 会连工作目录中的文件也一并删除。目录需要加 -r。
找出匹配忽略规则的已跟踪文件
新应用模板后,要确认哪些文件被匹配,请使用以下命令。
git ls-files -ci --exclude-standard
-c 表示已跟踪的文件,-i 表示只列出匹配忽略规则的文件,--exclude-standard 表示同时应用 .gitignore、.git/info/exclude 和全局设置。如果列表无误,可以一次性取消跟踪。
# bash / zsh
git ls-files -ci --exclude-standard -z | xargs -0 git rm --cached --
# PowerShell
git -c core.quotePath=false ls-files -ci --exclude-standard | ForEach-Object { git rm --cached -- "$_" }
在生成器的取消跟踪标签页中,可以按所用 shell 生成这些命令。
整体重新应用的方法
如果对 .gitignore 做了较大改动,也常用清空索引后重新添加的方法。
git rm -r --cached .
git add .
git commit -m "Apply .gitignore"
git add . 会应用忽略规则重新添加,因此忽略对象会被排除。不过,提交前务必用 git status 确认删除列表。在换行设置(core.autocrlf)发生过变化的仓库中,可能会有大量文件显示为已变更。
对其他人的影响
push 取消跟踪的提交后,其他人 pull 该提交时,其工作目录中的相应文件会被删除。 因为在 git 看来,这些文件是从仓库中被删除了。如果是 .env 或 IDE 设置这类每个人各自需要的文件,请提前通知他们备份。
如果机密信息已经被 push
取消跟踪只影响今后的提交。过去的提交中文件依然存在,任何人都能从历史中取出查看。处理顺序如下。
- 首先作废已暴露的密钥和密码,并重新签发。 这是最重要的一步。
- 取消对文件的跟踪,并将其加入 .gitignore。
- 如有必要,用 git filter-repo 之类的工具从历史中删除该文件并强制 push。已被 clone 或 fork 的副本无法删除,因此这一步不能替代第 1 步。
assume-unchanged、skip-worktree 不是忽略功能
git update-index --assume-unchanged 和 --skip-worktree 能暂时隐藏已跟踪文件的变更,但文件仍会被继续跟踪。
--assume-unchanged是用于性能的提示,相当于承诺 git 无需检查文件变更,git 在需要时可以无视这个标记。--skip-worktree是让 git 不去触碰工作目录中文件的标记,用于稀疏检出(sparse checkout)。
git 文档也明确建议不要为了忽略已跟踪文件的变更而使用这些选项。对于共享配置文件,提交 config.example.json、忽略实际的 config.json 是更安全的做法。
参考
- git-rm 官方文档
- git-ls-files 官方文档
- git-update-index 官方文档:NOTES
- GitHub Docs: Ignoring files
- 核实日期:2026-09-23 (用 git 2.50.1 验证命令)