从git中完全删除文件夹


Completely removing a folder from git

本问题已经有最佳答案,请猛点这里访问。

要从Git中删除名为build的文件夹,我使用:

1
git rm --cached -r build

从这个答案中我学到了。

但是,iiuc,目录仍保留在git的数据库中。

我测试过这个问题:

  • 初始化了新的Git存储库。
  • 添加了一个名为build的新目录,其中包含一个大文件(7MB)并提交。
  • 执行时间:

    1
    git rm --cached -r build
  • .git目录的大小保持为7MB,这意味着取消跟踪和删除并没有改变git的历史记录,这是一种冒昧的做法。

    如何彻底清除错误提交的目录,这些目录已提交了几次提交?

    在我的例子中,因为我只是第三次提交,对项目的历史几乎不关心,所以我删除了.git文件夹并重新开始,但我想知道是否有更好的方法。


    答案与从所有历史记录中删除一个文件相同(具有所有相同的警告),但不是指导过滤器删除一个文件,而是指示它删除从该路径开始的所有文件,例如,git rm --cached -rf path/to/directorygit filter-branch--index-filter。请参见,例如,如何从Git存储库的提交历史记录中删除/删除大型文件的答案?另请参见从所有Git存储库提交历史记录中完全删除文件。

    请注意,在使用git filter-branch之后(您应该在克隆上这样做),压缩存储库的最简单方法是克隆已筛选的克隆,因为过滤器无法更改现有提交,所以只需将它们复制到已更正的新提交即可。


    1
    git filter-branch --tree-filter 'rm -rf src/folder' HEAD

    git rm只从工作树上移除


    通常,您需要重写提交的历史记录,以便从所述提交中清除大文件。

    一个好的工具是bfg repo cleaner:它比本地git filter-branch更快。

    1
    java -jar bfg.jar --strip-blobs-bigger-than 5M some-big-repo.git

    过滤完提交之后,您仍然需要应用git-gc/repack/prune,以便实际减小大小。