git将文件添加到.gitignore后,仍显示为已修改。

423

我正在将这个添加到.gitignore文件中。

.idea/*

但无论如何状态都是:

#       modified:   .gitignore
#       modified:   .idea/.generators
#       modified:   .idea/dovezu.iml
#       modified:   .idea/misc.xml
#       modified:   .idea/workspace.xml

我做错了什么? 我甚至将 .idea/* 添加到全局 ~/.gitignore_global 中, 但是无论如何,git status 都向我显示:

#       modified:   .gitignore
#       modified:   .idea/.generators
#       modified:   .idea/dovezu.iml
#       modified:   .idea/misc.xml
#       modified:   .idea/workspace.xml

13个回答

660

你的 .gitignore 已经生效,但是它仍然跟踪这些文件,因为它们已经在索引中了。

要停止这个行为,你需要执行:git rm -r --cached .idea/

当你提交后,.idea/ 目录将从你的 Git 仓库中删除,接下来的提交将忽略这个目录。

注意:你可以使用 .idea/ 而不是 .idea/* 来忽略一个目录。你可以在.gitignore 手册页面上找到关于模式匹配的更多信息。


摘自 git-rm 手册页面的有用引言

--cached
    Use this option to unstage and remove paths only from the index. 
    Working tree files, whether modified or not, will be left alone.

3
不需要在 .gitignore 文件中添加 *。 - Steve Pitchers
2
不,只是添加.idea/是不起作用的,因为正如您在答案中所说,它已经在索引中了。 - Henrique de Sousa
29
所以您的意思是,在删除缓存文件后需要执行“commit”操作?这似乎与直觉相反;这些是我不想提交的文件。而且我也不希望它们从仓库中被删除(我只是希望它们不再存在,从而不会在“git status”中出现)。或者我可能只是非常困惑? - SMBiggs
13
由于早前已经提交了一次,他的文件已经被 Git 跟踪。因此,要将它们从仓库中删除,需要创建一个新的提交来删除它们。 - mcls
3
git rm -r --cached *我使用了这个命令来删除所有已缓存的文件,但它删除了我的所有文件...请帮我撤销此操作!@maartencls - iamabhaykmr
显示剩余5条评论

146

对于仍在搜索此问题并仅查看此页面的人来说,这将帮助您删除缓存的索引文件,然后仅添加您需要的文件,包括对.gitignore文件的更改。

1. git rm -r --cached .
2. git add .
3. git commit -m 'Removing ignored files'

这里有更多信息。

  1. 该命令将从索引中删除所有缓存文件。
  2. 该命令将添加除在gitignore中被提及的文件以外的所有文件。
  3. 该命令将重新提交您的文件并移除您想要Git忽略但保留在本地目录中的文件。

2
这对我很有用,我只想指出在Windows cmd中,单引号似乎在#3中不起作用。使用 git commit -am“删除被忽略的文件” 确实有效。 - Sundance.101
1
没问题,再次感谢您清晰简明的回答。 - Sundance.101
15
这个解决方案真的搞乱了我的项目文件。我在执行这个操作后不得不恢复一切。 - Fatmajk
哇..这对我有用。我已经寻找了很长时间了。谢谢。 - Vijay
2
你不需要删除所有文件,只需删除你不想包含在忽略列表中的文件:git rm -r --cached 文件名…… 其余步骤都没问题。 - Pawan Deore

26

对我来说,使用git rm --cached *file*并不起作用(我知道这个问题已经存在8年了,但它仍然是这个主题搜索结果的首选),它确实从索引中删除了该文件,但也从远程中删除了该文件。

我不知道为什么会这样。我想要的只是保持本地配置的隔离(否则我必须在每次提交之前注释本地主机基础URL),而不是删除远程相当于配置的文件。

阅读更多后,我发现了似乎是正确方法来解决这个问题,而且是唯一完成我所需操作的方式。尽管需要更多关注,特别是在合并时,但它确实能做到。

无论如何,它所需要的只是git update-index --assume-unchanged *path/to/file*

据我所知,这是需要记住的最重要的事情:

如果Git需要修改索引中的此文件(例如,当合并提交时),它将(优雅地)失败;因此,在上游更改了假定未跟踪的文件的情况下,您需要手动处理该情况。


对我来说,“git update-index --skip-worktree path/to/file” 更合适,因为我想保留修改本地文件的权利。 - klsx
你可以按照我建议的做,然后随意编辑文件。Git 不会检查该文件的增量差异,这基本上就是你需要的全部内容,以忽略该文件。 - RRE Designs
2
很高兴终于找到了一个适用于现代Git(2022年)的解决方案。git update-index --assume-unchanged .mydir/myfile 对于一个未被忽略的“卡住”的文件完美地起作用。 - James
1
这实际上就是 git rm --cached 的目的 :) 它会从仓库中(包括远程仓库)移除文件并停止跟踪 .gitignore 中的文件。是的,你说得对。如果你只想在本地停止跟踪而不影响远程仓库,你需要使用 git update-index --skip-worktree(注意不应该使用 --assume-unchanged)。 - ADTC

9

update-index --skip-worktree

update-index --skip-worktree 是针对git的选项,用于忽略配置文件。

$ git update-index --skip-worktree <filepath>

注意不需要向 .gitignore 中添加任何内容。
例如当配置文件的通用结构发生更改时,要取消这个。
$ git update-index --no-skip-worktree <filepath>

--skip-worktree 的作用是指示git永远不要将特定文件的更改纳入索引。这可能是因为开发人员通常需要在本地更改文件以便测试项目。例如,如果主存储库upstream托管了一个生产就绪的配置文件,应防止意外提交对该文件的更改。

相反,--assume-unchanged 假设开发人员永远不会更改该文件。此标志仅旨在通过从不更改包含软件开发工具包(SDK)组件的文件夹来提高git的性能。


谢谢,这解决了我的使用情况。(我想在凭据文件格式中进行存根,而不将任何真实凭据提交到仓库中。)只是希望当时机到来时我能记得如何撤销它!如果你遇到“fatal: Unable to mark file”错误,请参考Windows上大小写敏感性的这个问题。同样,在Windows下,需要使用“/”而不是“\”作为路径分隔符。 - undefined

6
这里和其他地方提供的解决方案对我没有用,所以我想为未来的读者增加讨论。我承认我还不完全理解这个过程,但终于解决了我的(类似的)问题,并想分享一下。
当在Windows 10上使用IntelliJ IDEA和git工作时,我无意中缓存了一些包含几百个文件的文档目录,并将它们添加到了.gitignore中(可能还移动了它们),但无法将它们从Default Changelist中移除。
我首先提交了我实际进行的更改,然后开始解决这个问题 - 这花费了我太长时间。我尝试使用git rm -r --cached .,但总是出现path-spec错误,使用-f-r标志的不同变体也是如此。 git status仍会显示文件名,因此我尝试直接使用其中一些文件名来运行git rm -cached,但没有成功。储藏和取消储藏更改似乎有效,但它们在一段时间后又排队了(我有点模糊具体时间)。 最终,我使用了以下命令永久删除了这些条目:
git reset

我假设这只是在你没有准备提交的已缓存更改时才是一个好主意。

谢谢!是的,我在切换具有不同.gitignore的分支后遇到了这个问题 - Github桌面客户端决定将文件暂存以进行提交。 - jameslol
1
一定要备份,特别是像用户上传这样的非跟踪文件,如果您不确定自己在做什么,很容易丢失它们。 - john Smith

5

这将允许您删除缓存的索引文件,然后只添加您需要的文件,包括更改您的.gitignore文件。

  1. git rm -r --cached .
  2. git add .
  3. git commit -m '删除被忽略的文件'

这些操作完成以下内容:

步骤1:此命令将清除所有缓存文件的索引。

步骤2:此命令将添加除了在gitignore列表中的文件以外的所有文件。

步骤3:使用此命令,您可以删除希望Git忽略的文件,同时保留它们在本地目录中,并重新提交您的文件。


4

只需添加 git rm -r --cached <文件夹名称/文件名称>

有时,在提交命令文件之后,您会更新.gitignore文件。因此,这些文件会被缓存在内存中。要删除缓存的文件,请使用上述命令。


3
这也会发生在你像这样保存它:echo node_modules >> .gitignore Windows终端以UCS-2 LE BOM编码保存文件,而git似乎不接受这种编码。
所以,你可以用记事本打开文件,并使用UTF-8编码保存。

notepad save utf-8 encoding

现在它可以工作了。
我认为他们应该修复这个问题,因为执行echo "filetoignore" >> .gitignore实际上非常方便。

经过这么多的搜索,终于解决了我的问题。谢谢! - HFBrowning

2
如果您已经在.gitignore中添加了.idea/*,并且如果git rm -r --cached .idea/命令无法工作(注意:显示错误->致命错误:路径规范'.idea/'未匹配任何文件),请尝试以下方法:
从您的应用程序中删除.idea文件,然后运行此命令。
rm -rf .idea

现在运行git status并检查,在运行应用程序时会重新创建.idea文件夹,但不会被跟踪。


0
在我的情况下,.gitignore 文件出现了某种损坏。有时候它会正常显示,但有时候却是乱码。我猜测可能是编码的问题,但不能确定。为了解决这个问题,我删除了这个文件(之前是通过在 VS Code 命令行中使用 echo > .gitgore 创建的),然后在文件系统(资源管理器)中手动创建了一个新的文件,并添加了我的忽略规则。在新的 .ignore 文件放置好之后,一切都正常工作了。

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