添加到 .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 仍将文件显示为已修改的主要内容,如果未能解决你的问题,请参考以下文章