【问题标题】:How to ignore a file which is already committed?如何忽略已经提交的文件?
【发布时间】:2009-03-09 11:52:15
【问题描述】:

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

...
config/database.yml
.DS_Store

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

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

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

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

【问题讨论】:

    标签: git gitignore


    【解决方案1】:

    正如“ignoring doesn't remove a file ”中提到的那样
    (以下引用 Nick Quaranto 的精彩文章,
    在他的博客git ready“学习 git 一次提交一个”):

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

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

    git rm --cached <file>
    

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

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

    • 重写存储库的提交,或
    • 重新开始。

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

    如果您确实想从历史记录中删除文件,git filter-branch 就是您要寻找的钢锯。
    在使用它之前一定要阅读它的 manpage,因为它实际上会重写你项目的提交。对于某些操作来说,这实际上是一个很棒的工具,并且可以做各种各样的事情,比如完全删除作者的提交以移动项目根文件夹。从所有修订中删除文件的命令是:

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

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

    【讨论】:

      【解决方案2】:

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

      我找到了这个How do I stop Git from tracking any changes to a file from this commit forward?,这就是我要找的……

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

      【讨论】:

        猜你喜欢
        • 2013-08-31
        • 2014-05-22
        • 1970-01-01
        • 2021-09-20
        • 2021-03-24
        • 2010-11-11
        • 2016-06-15
        • 2015-12-30
        • 1970-01-01
        相关资源
        最近更新 更多