如果 Git 仍然列出某个文件,即使它符合 .gitignore 的规则,请将其从 Git 索引中移除,同时保留本地副本。在终端中进入该仓库,运行 git rm --cached -- "path/to/file",然后提交暂存的移除操作以及忽略规则。Git 官方文档确认忽略规则仅对未跟踪文件生效;它们不会停止跟踪已存在于索引中的文件。(Git gitignore 文档)
为什么 .gitignore 没有停止跟踪该文件
.gitignore 规则的作用是指示 Git 忽略匹配的未跟踪路径。如果某个文件已被添加到仓库中,无论后来添加了什么忽略规则,Git 都会继续跟踪它的变动。即便规则本身完全正确,但在你将其从索引中移除之前,它似乎仍不起作用。(Git gitignore 文档)
在 Mac 上打开终端,切换到仓库的顶层文件夹。Apple 的文档指出终端是 macOS 的命令行界面,并将 zsh 设为默认 shell;以下命令均适用于常规的 zsh 环境。在修改索引之前,请确认你位于正确的仓库中:
git status
下一条命令中的文件路径是相对于仓库根目录的。请将示例替换为实际路径。请保留引号:它们可以防止空格以及诸如 * 之类的字符被 shell 解析。-- 表示选项结束,因此以连字符开头的路径也会被当作路径处理。
从索引中移除文件并保留 Mac 上的副本
运行:
git rm --cached -- "path/to/file"
--cached 会从 Git 索引中移除该路径,但不会从工作区中删除。该文件仍将保留在你的 Mac 上。这会为下一次提交暂存一个移除操作;它不会抹去该文件之前的提交历史。(Git git rm 文档)
如果该路径位于某个目录内,且你希望停止跟踪整个目录,请添加 -r 并使用该目录的路径:
git rm --cached -r -- "path/to/directory"
请谨慎使用此命令:Git 会将该目录下所有已跟踪的路径从索引中移除。本地文件会保留,但移除操作已被暂存。如果由于文件包含暂存的更改或其内容与最新提交中的版本不同而导致 Git 拒绝执行,请停下来检查 git status;除非你明确知道哪些暂存的更改会被丢弃,否则请勿添加 -f。Git 文档说明了强制选项会覆盖针对此类更改的常规保护机制。(Git git rm 文档)
检查忽略规则并审查即将提交的内容
请确保 .gitignore 中的规则能从该忽略文件所在的位置正确匹配该路径。例如,位于仓库根目录的 .gitignore 中的 local-settings.json 规则会匹配任意目录层级下的同名文件;而 /local-settings.json 则仅限制匹配仓库根目录下的文件。Git 规则是相对于包含该 .gitignore 的目录而言的,更深层级中更具体的忽略文件可能会影响匹配结果。(Git gitignore 文档)
让 Git 查询哪条规则匹配了这个现已取消跟踪的文件:
git check-ignore -v -- "path/to/file"
-v 选项会显示适用的规则来源和具体表达式。如果没有任何输出,请重新检查拼写、路径以及规则文件的位置。Git FAQ 建议结合使用 git rm --cached 和匹配的忽略规则,以停止跟踪并忽略此前已跟踪的文件。(Git FAQ)
在提交之前,请检查暂存的更改和工作区副本:
git status
状态中应显示该路径已被暂存为删除,如果 .gitignore 的修改尚未暂存,它将显示为已修改。工作区中的文件应该仍然存在。如有需要,暂存该忽略文件,然后提交这两项更改:
git add -- .gitignore
git commit -m "Stop tracking local file"
如果相关的忽略文件位于子目录中,请在 git add 中使用其相对于仓库的路径。在提交之前再次检查 git status,尤其是如果有其他工作内容已被暂存时,以确保提交中仅包含你预期的更改。
提交之后会发生什么
提交之后,Git 不再在当前分支中跟踪该路径,并且忽略规则会防止它被意外重新添加。此次提交记录了一次移除操作,因此检出该提交的协作者会发现该跟踪文件从其工作区中被删除;Git 并不会自动为每个人保留其本地被忽略的副本。如果该文件包含团队成员仍需要的共享配置,请在提交前进行协调。之前提交的版本仍保留在仓库历史中,因此该操作不会删除过去的历史副本。(Git git rm 文档)
如果你只是想隐藏本地的编辑,同时让该文件对其他人保持跟踪状态,.gitignore 并不是合适的机制。Git 建议不要为此目的使用 assume-unchanged 或 skip-worktree;建议改为使用已跟踪的模板文件并配合一个单独被忽略的本地配置文件。(Git FAQ)
来源
Git - gitignore 文档 — Git
Git - git-rm 文档 — Git
Git FAQ — Git
在 Mac 上的“终端”中更改默认 Shell — Apple 支持