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

Posted

技术标签:

【中文标题】添加到 .gitignore 后,git 仍将文件显示为已修改【英文标题】:git still shows files as modified after adding to .gitignore 【发布时间】:2012-04-02 18:48:18 【问题描述】:

我将此添加到 .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

【问题讨论】:

Making git "forget" about a file that was tracked but is now in .gitignore的可能重复 【参考方案1】:

您的.gitignore 正在工作,但它仍在跟踪文件,因为它们已经在索引中。

要阻止这种情况,您必须这样做:git rm -r --cached .idea/

当您提交时,.idea/ 目录将从您的 git 存储库中删除,并且以下提交将忽略 .idea/ 目录。

PS:您可以使用.idea/ 而不是.idea/* 来忽略目录。您可以在 the .gitignore man page 上找到有关模式的更多信息。


来自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.

【讨论】:

@Mehrad 不需要 .gitignore 中的 * 不,只是添加 .idea/ 不起作用,因为就像您在答案中所说的那样,它已经在索引中了。 所以你是说删除缓存文件后需要commit?这看起来确实违反直觉。这些是我不想提交的文件。而且我不希望它们从存储库中删除(我只是希望它们不再徘徊在我的git status 中)。还是我真的很困惑? 他的文件已经被 git 跟踪,因为之前的提交,所以为了删除它们,你必须创建一个新的提交,从存储库中删除它们。 git rm -r --cached * 我使用此命令删除了所有缓存的所有类型的文件...但它删除了我的所有文件...请帮助我撤消此操作! @maartencls【参考方案2】:

对于可能仍在搜索此问题的人,仅查看此页面。

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

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

Here 提供更多信息。

    此命令将从索引中删除所有缓存文件。 此命令将添加除gitignore 中提及的文件之外的所有文件。 此命令将再次提交您的文件并删除您希望 git 忽略的文件,但将它们保留在您的本地目录中。

【讨论】:

这对我很有用,我只想指出,在 windows cmd 中,单引号在 #3 中似乎不起作用。不过,使用 git commit -am “删除忽略的文件”确实有效。 不用担心,再次感谢您简洁明了的回答。 这个解决方案真的弄乱了我的项目文件。完成此操作后,我必须还原所有内容。【参考方案3】:

使用git rm --cached *file* 对我来说效果不佳(我知道这个问题已有 8 年历史了,但它仍然显示在搜索该主题的顶部),它确实从索引中删除了文件,但是它还会从远程删除文件。

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

阅读更多内容后,我发现似乎是 the proper way to do this,这是完成我需要的唯一方法,尽管它确实需要更多关注,尤其是在合并期间。

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

据我了解,这是最值得注意的事情:

如果需要修改索引中的这个文件,Git 将失败(优雅地),例如合并提交时;因此,如果假设的未跟踪文件在上游发生更改,您将需要手动处理这种情况。

【讨论】:

对我来说 'git update-index --skip-worktree path/to/file' 更合适,因为我想继续修改本地文件 您可以按照我的建议进行操作,并且仍然可以随意编辑文件。 Git 不会检查该文件的增量,而这几乎就是您忽略该文件所需的全部内容。【参考方案4】:

这里和其他地方提供的解决方案对我不起作用,所以我将添加到未来读者的讨论中。我承认我还没有完全理解这个过程,但终于解决了我的(类似的)问题并想分享。

在 Windows 10 上的 IntelliJ IDEA 中使用 git 时,我不小心缓存了一些包含数百个文件的文档目录,并且在将它们添加到 .gitignore(并且可能会移动它们一点)之后,我无法将它们删除来自默认更改列表。

我首先提交了我所做的实际更改,然后着手解决这个问题 - 我花了太长时间。 我尝试了git rm -r --cached .,但总是得到path-spec 错误,path-spec 以及-f-r 标志的不同变体。

git status 仍然会显示文件名,所以我尝试将其中的一些逐字与git rm -cached 一起使用,但没有运气。 隐藏和取消隐藏更改似乎有效,但一段时间后它们再次排队(我对确切的时间框架有点模糊)。 我终于永久删除了这些条目

git reset

我认为这只是一个好主意,当您没有暂存/缓存您实际想要提交的更改时。

【讨论】:

谢谢!是的,在具有不同 .gitignores 的分支之间切换后,我遇到了这个问题 - Github 桌面客户端决定暂存文件以进行提交 一定要备份,尤其是非跟踪文件,比如用户上传的文件,如果你不是 100% 确定自己在做什么,很容易丢失它们【参考方案5】:

只需添加git rm -r --cached <folder_name/file_name>

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

【讨论】:

【参考方案6】:

如果您的 .gitignore 中已经添加了 .idea/* 并且如果 git rm -r --cached .idea/ 命令不起作用(注意:显示错误-> 致命:pathspec '.idea/' 不匹配任何文件)试试这个

从您的应用程序中删除 .idea 文件运行此命令

rm -rf .idea

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

【讨论】:

【参考方案7】:

如果您使用 echo node_modules >> .gitignore 之类的内容保存它,也会发生这种情况

windows 终端以UCS-2 LE BOM 编码保存文件,git 似乎不接受。

因此,您可以使用Notepad 打开文件并使用UTF-8 编码保存

现在可以使用了。

我认为他们应该解决这个问题,因为 echo "filetoignore" >> .gitignore 实际上看起来很方便。

【讨论】:

经过这么多搜索,这终于解决了我的问题。谢谢!【参考方案8】:

在我的情况下,.gitignore 文件以某种方式损坏。它有时显示正常,但有时是乱码。我想编码可能是罪魁祸首,但不能确定。为了解决这个问题,我删除了文件(之前在 VS Code 命令行中通过 echo > .gitgore 创建)并在文件系统(资源管理器)中手动创建了一个新文件,然后添加了我的忽略规则。新的.ignore 到位后,一切正常。

【讨论】:

【参考方案9】:

我会在这里插话。在我的例子中,一个子目录中有一个 git repo,因为我从其他人那里解压了一个 zip 文件,然后递归地将他们解压后的 zip 中的所有内容复制到我的 repo 中,而没有检查我正在复制的内容。

一旦我删除了现有仓库中的 .git 目录,一切都很好..

【讨论】:

【参考方案10】:

    Git 添加。

    Git status //检查正在修改的文件

    // git reset HEAD --- 替换你要忽略的文件

    git reset HEAD .idea/

    git commit -m ''

    git 推送

【讨论】:

这将是 OP 想要重置的假设。

以上是关于添加到 .gitignore 后,git 仍将文件显示为已修改的主要内容,如果未能解决你的问题,请参考以下文章

.gitignore文件中添加忽略文件或者目录后,不起作用。

Git 学习笔记 ignore 忽略文件

Git 学习笔记 ignore 忽略文件

加入.gitignore的文件有啥办法恢复出来不

git 修改 .gitignore 不生效

Git 的 .gitignore 配置