从 Git 仓库中永久删除文件或目录

我们常用的 git rm 仅对 Working Tree 构成影响,如果想永久的删除仓库中的文件或目录,那么就要用到 git filter-branch 命令了。git filter-branch 会检索整个 Commit 历史,逐一改写 Commit Object,重构整个 Tree。

git filter-branch --tree-filter 'rm -rf path/folder' HEAD
git filter-branch --tree-filter 'rm -f path/file' HEAD

也可以指定 检索的 Commit 历史的范围:

git filter-branch --tree-filter 'rm -rf path/folder' 347ae59..HEAD

最后,不要忘了向仓库强制推送所有的变化:

git push origin master --force

执行 git filter-branch 命令后,已经标记为删除的 Object 在本地仓库中要到过期后才会解除关联和进行垃圾回收。检查哪些 tags 和 branch 引用了这些 Object:

git for-each-ref --format='delete %(refname)' refs/original

如果想立即解除关联,执行垃圾回收,可以这么做:

git for-each-ref --format='delete %(refname)' refs/original | git update-ref --stdin
git reflog expire --expire=now --all
git gc --prune=now

接下来,就是强制推送到仓库了:

git push origin --force --all
git push origin --force --tags

不到迫不得已,不要轻易使用 git filter-branch,因为它重构了整个 Tree,所以每个开发人员都需要重新克隆仓库到本地,对于有很多开发者参与的大型项目来说,这么做会给很多人带来麻烦,与其事后对仓库内容进行修正,不如伊始就对每个 Commit 慎之又慎。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 本片内容转自CSDN http://blog.csdn.net/ithomer/article/details/7...
    五娃儿阅读 10,346评论 2 87
  • 转 33.2Git命令介绍 一、Git常用命令速查 gitbranch 查看本地所有分支 git status 查...
    xjbclz阅读 4,538评论 0 11
  • Add & Commit git init 初始化一个 Git 仓库(repository),即把当前所在目录变成...
    冬絮阅读 10,349评论 0 9
  • 删删写写,总得有个开头。 我无法直视自己过往的感情,糟糕透顶,甚至让我多次说我没有真正谈过一段恋爱。没有一个人...
    夜刷阅读 3,008评论 0 2
  • 一次偶然的机会,听一位老师讲到“强迫性重复”,受益匪浅! 强迫性的重复,是许多心理辅导者从事临床治疗时常见的一个现...
    zscleo阅读 1,449评论 0 0