今天在准备将之前一个工程文件压缩打包一下,发现压缩时间很长,怀疑工程内部的git版本管理文件夹.git占比大造成的。利用ncdu命令进行查看,发现.git文件夹使用了80M,看来是之前提交的一些大的文件造成的,虽然后期那些文件删除了,但是在git版本管理中因为已经提交了几个版本,所以还存在。于是Google如何删除.git中的大文件。


使用Git命令的方式

  1. 进入工程文件夹,开始查看占用最大的5个文件

    1
    git rev-list --objects --all | grep "$(git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -5 | awk '{print$1}')"
  2. 对查找出的文件进行删除

    1
    git filter-branch --force --index-filter 'git rm -rf --cached --ignore-unmatch big-file.jar' --prune-empty --tag-name-filter cat -	- --all
  3. 更新提交到远程仓库,然后删除本地文件

    1
    2
    3
    git push origin --force --all
    rm -rf .git/refs/original/
    git reflog expire --expire=now --all && git gc --prune=now

使用工具的方式

一个由scala编写的工具对git大文件进行清理 BFG Repo-Cleaner

  1. 使用–mirror的方式克隆当前的工程

    1
    git clone --mirror git://example.com/some-big-repo.git
  2. 使用Java的jar命令启动bfg.jar开始扫描仓库大于20M的文件

    1
    java -jar bfg.jar --strip-blobs-bigger-than 20M some-big-repo.git
  3. 进入–mirror方式克隆的目录,执行清除操作

    1
    git reflog expire --expire=now --all && git gc --prune=now --aggressive
  4. 执行下面的命令,等待上传到远程仓库完成更新。由于是使用的–mirror的方式克隆的仓库,push操作会提交到所有分支

    1
    git push

我这里推荐工具的方式进行删除操作,速度快,不易出错。