git 仓库瘦身

git 仓库瘦身

2022-11-04 17:22:38

ox1 问题

某天克隆一个仓库

git clone https://github.com/SunSeekerX/uni-plugin-android-starter.git
Cloning into 'uni-plugin-android-starter'...
remote: Enumerating objects: 1832, done.
remote: Total 1832 (delta 0), reused 0 (delta 0), pack-reused 1832
Receiving objects: 100% (1832/1832), 158.61 MiB | 9.75 MiB/s, done.
Resolving deltas: 100% (780/780), done.

158.61 MiB 很显眼,要不是有加速,不知道要克隆到何年何月。很明显 .git 工作文件夹提交了不该提交的东西。因为 git 是不会删除文件的,历史所有东西都在 .git 目录存着,以防止有回退找文件的一天。

除去 .git 文件夹之外的体积只有不到 50mb,所以肯定是有优化空间的。

0x2 清理工具

BFG Repo-Cleaner

git filter-branch 绝佳的替代品。

这是一个 java 工具,所以需要 java 环境,把 jar 包下载下来放在你知道的地方。比如我 D:\app\bfg-1.14.0.jar

克隆仓库

git clone --mirror git://example.com/some-big-repo.git

然后到工程外面的一级目录下执行。

java -jar bfg.jar --strip-blobs-bigger-than 100M some-big-repo.git
  • 100M 是删除多大以上的文件 100M 表示删除大于 100M 的文件

运行命令

java -jar D:\app\bfg-1.14.0.jar --strip-blobs-bigger-than 1M .\uni-plugin-android-starter.git\

# mac 示例
java -jar ~/app/bfg-1.14.0.jar -b 10k uni-plugin-ios-starter

运行完成之后直接进入项目目录

cd some-big-repo.git
git reflog expire --expire=now --all && git gc --prune=now --aggressive

最后推送上去

受保护的分支 会导致失败。要继续,您必须移除分支保护、推送,然后重新启用受保护的分支。

# 使用了 --mirror,同时会更新 tag
git push
# 直接克隆的整个仓库
git push origin --force 'refs/heads/*'

要从标签版本中删除大文件,请强制将您的更改推送到 GitLab 上的所有标签

受保护的标签 会导致失败。要继续,您必须移除标签保护、推送,然后重新启用受保护的标签。

git push origin --force 'refs/tags/*'

提示❗

提交了之后需要告知开发的小伙伴重新拉下项目,不能把自己本机的提交上来,不然你的工作就会被覆盖了。因为本质上是对 git 历史提交做了修改。小伙伴是无法使用 git pull 同步你的修改的。

0x3 结果

折腾完之后看看少了三分之二,嗯,很舒服。😎