跳至主要內容

git大文件处理

init-qyDevOpsgit大约 1 分钟

背景

最近在开发flutter+unity的手机 app 项目,因为第一次开发unity,并不是很了解unity的文件目录,有很多测试用资产(Assets)中的 3d 模型文件也被放进了git中,这就造成了git仓库的庞大。

其实这种资产管理用svn处理会更好,毕竟包含了大量图片,音频及二进制文件,但目前项目很小,用git管理也还好。

步骤

  1. 查看 git 仓库大小

    git count-objects -vH
    
  2. 查看有哪些大文件

    git rev-list --objects --all | grep "$(git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -10 | awk '{print$1}')"
    
  3. 从 git 所有分支历史中删除该文件

    git filter-branch --force --index-filter 'git rm -rf --cached --ignore-unmatch <bigfile>' --prune-empty --tag-name-filter cat -- --all
    
  4. 回收本地空间

    rm -rf .git/refs/original/
    git reflog expire --expire=now --all
    git gc --prune=now
    git gc --aggressive --prune=now
    
  5. 推送到远端仓库

    git push origin --force --all
    

其他

在上述步骤执行完毕并推送到远端后,有时会发现远端的 git 仓库不仅没有变小,甚至变大了,这是因为远端的git仓库没有 gc。

我使用的是公司内部的GitLab,仅以此为例,可以使用GitLabHousekeepingopen in new window功能即可。

更多详情可以参考这篇文章open in new window