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

标签 git github gitignore

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

这是我的 .gitignore 文件:

 .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 的索引最初是从您 checkout 的提交中填充的。因此,如果某个文件存在于某个提交中,并且您 git checkout 该提交或 git switch 到它,该提交的文件将进入 Git 的索引。它现在在 Git 的索引中并且根据定义被跟踪。请注意,在此 checkout/切换操作期间,Git 其索引您的工作树同时填写。

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

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

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

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

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

当你运行 git commit 时,Git——在那个时候——卡住 Git 索引中存在的每个文件的快照副本,与它出现在Git 的索引。这些是进入 提交的文件。因此,索引始终保存您建议包含在下一次提交中的文件。这就是为什么 Git 在您 checkout 该提交时填充当前 提交的索引:以便建议的下一个 提交与当前 提交相匹配您刚刚 checkout 。1

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

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


1这里有一些特殊情况:见Checkout another branch when there are uncommitted changes on the current branch血淋淋的细节。

关于git - 尽管将文件添加到 .gitignore 中,但文件并未被忽略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66716064/

相关文章:

github - 如何结束在同一存储库中运行的 'another git process'?

git - 忽略的文件仍然显示更改

android - 首先提交 Android Studio 项目——应该遗漏什么?

git - 推送到 GitHub 的 Node.js 模块

git - git中如何自动排除某些文件类型?

git - Jenkins 的 Gerrit 触发器找不到要构建的任何修订

git - smartgit 分支窗口中的箭头

git - 在 git 上,我检查了以前的提交,现在找不到我以后的提交

git - jhbuild 存储库克隆失败

git fetch --unshallow 给出 :"fatal: --unshallow on a complete repository does not make sense"错误