尽管将文件添加到 .gitignore 中,但文件并未被忽略

File is not ignored despite adding it to .gitignore

我想忽略我的 git 项目的文件夹 .obsidian/ 中的文件 workspace。为此,我修改了 .gitignore 文件。

这是我的.git忽略文件:

 .obsidian/cache
 .obsidian/workspace
 .trash/
 .DS_Store

但是,文件更改后我仍然收到此消息:

➜ git status
On branch main
Your branch is ahead of 'origin/main' by 2 commits.
  (use "git push" to publish your local commits)

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
    modified:   .obsidian/workspace

no changes added to commit (use "git add" and/or "git commit -a")

我不知道为什么会这样,也不知道该怎么办。

.obsidian/workspace 是一个 跟踪的 文件。永远不会忽略被跟踪的文件。

跟踪 文件是 Git 索引 现在 .

中的任何文件

Git 的索引最初是从您检出的提交中填充的。因此,如果某个文件存在于某个提交中,并且您 git checkout 提交或 git switch 提交,则该提交的文件将进入 Git 的索引。它现在在 Git 的索引中,根据定义,已被跟踪。请注意,在此结帐/切换操作期间,Git 同时填写 其索引 您的工作树。

您可以随时操作 Git 索引中的文件:

  • 运行 git add 在您的工作树中的某个文件上——这是您可以查看和编辑的文件版本——踢掉该文件的任何现有副本 out Git 的索引,然后将文件的工作树版本放入 Git 的索引中。所以现在索引和工作树副本匹配。该文件也被跟踪,因为它存在于 Git 的索引中。

  • 运行 git rm 在 Git 的索引和您的工作树中的某个文件上,从 [=114] 中删除文件的副本=] 的索引,并从您的工作树中删除文件的副本。该文件现已完全消失,因此未被跟踪。

  • 运行 git rm --cached 在 Git 的索引和您的工作树中的某个文件上,从 Git 的索引,但将副本单独留在您的工作树中。根据定义,该文件现在 未跟踪,因为它存在于您的工作树中,但不再存在于 Git 的索引中。

  • 最后——这是多余的但值得注意——如果你删除两个地方的某个文件的工作树副本,然后使用git add 在该文件上,Git 将从其索引中删除副本。所以这与该文件的 git rm(没有 --cached)具有相同的效果。

当您 运行 git commit、Git—当时—冻结每个文件的快照副本 存在于 Git 的索引中,与它出现在 Git 的索引 中完全一样。这些是进入 new 提交的文件。因此索引 始终保存您建议包含在下一次提交中的文件 。这就是为什么 Git 在您签出该提交时填写 current 提交的索引:以便建议的 next 提交匹配您刚刚检出的 当前 提交。1

如果您希望忽略一个文件,但它当前已被跟踪,您必须从Git的索引中删除该文件。但是请注意,如果该文件存在于某些现有的 commits 中,那些 commits 将继续包含该文件。 提交,从 Git 的索引中删除文件后,将 忽略 该文件。比较 existing 提交与 new 提交将显示该文件已被删除。

如果您曾检出 具有 文件的旧提交之一,则切换到 缺少 的较新提交之一文件 Git 将 删除文件 — 因为这是新旧提交之间的区别!所以在删除不应该提交的文件后要小心。现有提交 do 有文件,即使它们不应该有。检查 拥有该文件的较旧的现有提交将在未来造成痛苦。


1这里有一些特殊情况:请参阅 Checkout another branch when there are uncommitted changes on the current branch 了解详细信息。