删除git历史仓库中的大文件

背景

随着长时间使用git库 因为以前的不注意导致里面存在很多缓存文件入库了 虽然使用git rm -rf xxx --cached的方式能删除库里面的文件 但是clone的时候发现 项目大小并没有降低。 故目前提供一种直接删除库历史文件的方法。

解决方案

通过查找资料,看到可以通过BFG工具来清理git仓库。在GitHub的帮助页面中也推荐了这个工具。官网说是比git-filter-branch工具快10-720倍。这里根据我的使用,介绍一下这个工具。

这个工具的官网:https://rtyley.github.io/bfg-repo-cleaner/

这是一个Java程序,使用的话需要安装Java运行环境

使用方法

主要是将官网的流程用中文来写一下。其中的仓库以我本人的机械臂代码仓库为例子。使用起来很简单,快捷。

1.下载官网的程序包。例如我这里下载的为bfg-1.13.0.jar,之后将程序包放到一个文件夹里,为了方便,重命名为bfg.jar。

2.clone自己的git repo,使用–mirror参数。

git clone --mirror git@github.com:xxx/xxx.git repo.git

3.清除大文件,文件夹,隐私文件

这里官网给出的命令是这样的。第一句是删除文件,第二句是删除文件夹,两个语句的区别在附加参数上。这里,不指定文件/文件夹位置,只是用名称匹配。

java -jar bfg.jar --delete-files xxx repo.git
java -jar bfg.jar --delete-folders xxx repo.git

这样会有一个问题,这种情况bfg会保护当前版本(HEAD所指的版本),不去清理。提示如下。

Protected commits
-----------------

These are your protected commits, and so their contents will NOT be altered:

 * commit ******* (protected by 'HEAD')

如果说当前版本已经没有问题,那么这么使用没有问题。

但是我的当前版本也是有需要删除的文件的,在谷歌搜索了一下,找到了解决方法。

在命令行下加入–no-blob-protection命令,可以解除保护。我使用的命令如下。

java -jar bfg.jar --delete-files xxx repo.git --no-blob-protection

java -jar bfg.jar --delete-folders xxx repo.git --no-blob-protection
  • xxx为需要删除的文件,repo为需要处理的仓库地址。
  • 官网默认此命令将在仓库的上一级目录使用,主要是因为执行该命令会生成report文件。如果在项目中运行的话,需要将report相关目录添加至.gitignore中。
  • 如果是在项目内部调用命令,则将repo.git替换成.git即可。毕竟.git为仓库在本地缓存路径。
  • 也可以直接在命令行中执行 alias bfg=java -jar xxx/bfg.jar。xxx为jar包所在的绝对路径,方便减少命令行长度。

 4.清理不需要的数据

在完成上面的指令后,实际上这些数据/文件并没有被直接删除,这时候需要使用git gc指令来清除。

cd repo.git  # 如果项目在repo中执行的话,则不需要执行该命令
git reflog expire --expire=now --all && git gc --prune=now --aggressive

5.推送到GitHub

最后,更新完本地仓库后,将数据推送到GitHub远程仓库。按照官网描述,由于之前使用了–mirror参数,推送时会推送所有内容。

git push


参考

Avatar
fwy
服务员

相关