guide

用 .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

取消跟踪只影响今后的提交。过去的提交中文件依然存在,任何人都能从历史中取出查看。处理顺序如下。

  1. 首先作废已暴露的密钥和密码,并重新签发。 这是最重要的一步。
  2. 取消对文件的跟踪,并将其加入 .gitignore。
  3. 如有必要,用 git filter-repo 之类的工具从历史中删除该文件并强制 push。已被 clone 或 fork 的副本无法删除,因此这一步不能替代第 1 步。

assume-unchanged、skip-worktree 不是忽略功能

git update-index --assume-unchanged--skip-worktree 能暂时隐藏已跟踪文件的变更,但文件仍会被继续跟踪。

git 文档也明确建议不要为了忽略已跟踪文件的变更而使用这些选项。对于共享配置文件,提交 config.example.json、忽略实际的 config.json 是更安全的做法。

参考

← 上一篇用 .git/info/exclude 编写只属于自己的忽略规则