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

3
我希望忽略我的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")


我不知道为什么会发生这种情况,也不知道该怎么做。
1个回答

6

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

被跟踪的文件是指任何当前在 Git 索引中的文件。

Git 的索引最初是从你检出的提交中填充的。所以如果某个文件存在于某个提交中,而你 git checkoutgit switch 到该提交,那么该文件就会从该提交中进入 Git 的索引。现在它已经在 Git 的索引中,并且根据定义,是被跟踪的。请注意,在此检出 / 切换操作期间,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从当前提交中填充索引的原因:这样,提议的下一个提交将与您刚刚检出的当前提交匹配。1 如果要忽略某个已跟踪的文件,则必须从Git索引中删除该文件。但是请注意,如果该文件存在于某些现有的提交中,则这些提交将继续包含该文件。从Git索引中删除该文件后,您进行的新提交将省略该文件。将现有提交与新提交进行比较,将显示该文件已被删除。
如果您查看包含该文件的旧提交之一,然后切换到缺少该文件的新提交之一,则Git将删除该文件——因为这就是旧提交和新提交之间的区别!因此,在删除不应提交的文件后要小心。即使不应该存在,现有提交中仍然有该文件。查看具有该文件的旧提交将在未来带来麻烦。

1这里有一些特殊情况: 请参阅在当前分支存在未提交更改时切换到另一个分支以获取详细信息。


5
简而言之,对于那个文件/文件夹,请使用git rm --cached命令,然后将其添加到你的.gitignore文件中。 - Binar Web

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接