28

以前,以下是我的.gitignore文件:

...
config/database.yml
.DS_Store

后来我app_config.yml在 config 目录中创建了一个文件并提交了它。

现在,我意识到我不需要app_config.ymlgit 存储库中的文件。我修改了我的.gitignore文件:

...
config/app_config.yml
config/database.yml
.DS_Store

现在,当我提交时,该app_config.yml文件仍在我的仓库中。我想从我的仓库中删除该文件。我该怎么做?

4

2 回答 2

56

正如“忽略不会删除文件”中提到的
(以下引用Nick Quaranto的精彩文章,
在他的博客git ready “一次学习 git 一次提交”):

当你告诉 Git 忽略文件时,它只会停止监视该文件的更改,而不是其他任何东西。
这意味着历史仍然会记住该文件并拥有它

如果要从存储库中删除文件,但将其保留在工作目录中,只需使用:

git rm --cached <file>

但是,这仍会将文件保留在历史记录中。

如果你真的想从历史中删除它,你真的有两个选择:

  • 重写存储库的提交,或
  • 重来。

这两种选择都很糟糕,这是有充分理由的:Git 努力不丢失您的数据。
就像变基一样,Git 迫使您考虑这些选项,因为它们是破坏性操作。

如果您确实想从历史记录中删除文件,git filter-branch那么您正在寻找的是钢锯。
在使用它之前一定要阅读它的手册页,因为它会从字面上重写你的项目的提交。这实际上是用于某些操作的好工具,并且可以执行各种操作,例如完全删除作者的提交以移动项目根文件夹。从所有修订中删除文件的命令是:

git filter-branch --index-filter 'git rm --cached <file>' HEAD

当您需要清除可能已放置在存储库中的敏感或机密信息时,此操作绝对有用

于 2009-03-09T12:04:01.907 回答
5

当您想开始忽略已提交的文件并希望将其保留在项目中时,这无济于事...因为git rm --cached会从 git repo 中删除它...

我发现这个如何阻止 Git 跟踪从此提交向前对文件的任何更改?这就是我要找的..

希望它对其他人也有用......

于 2019-02-26T03:51:44.833 回答