从 git 中删除旧的二进制版本并减少 git 存储库的大小

Wil*_*l H 6 git

因此,目前我遇到了一个似乎非常复杂的问题,我需要一些帮助来解决如何修复它,而无法将二进制文件移动到 CDN/保管箱等。在评估此问题时,请注意删除图像/pdf 等并放入遗憾的是,不能将它们放在保管箱或其他外部存储中。

所以当前的问题是我有几百个存储库,每个存储库都有几千次提交,每个存储库通常有 3 个分支。在我的一个测试存储库中,如果我对存储库执行 du -sh,其大小约为 13GB。其中工作目录大小约为 800mb。因此,到目前为止,我为减小尺寸所做的尝试如下:

git filter-branch --index-filter "git rm -rf --cached --ignore-unmatch path/to/largest/files.pdf" HEAD
rm -rf .git/refs/original/ && git reflog expire --all &&  git gc --aggressive --prune
git gc --prune=now --aggressive
git repack -a -d --depth=250 --window=250
Run Code Online (Sandbox Code Playgroud)

经过上述所有测试后,du -sh 上的存储库目录仍然显示其大小为 13GB。所以我的下一个想法是删除所有二进制文件历史记录(jpg / pdf / png 等),但仅保留二进制文件的最新版本。然而我不确定如何实现这一点,我可以做一个 for i in find -name "*.pdf"; 例如,执行 git filter-branch --index-filter "git rm -rf --cached --ignore-unmatch $i" HEAD 完成,但我不确定这是否是解决问题的最佳方法,因为它可能会需要很长时间才能完成所有不同的资产类型。

这里的主要目标是通过仅在历史记录中保留二进制文件的 1 个修订版来减小大小,以便包文件的大小更小,历史记录中所有以前删除的二进制文件也可以被删除,我对此 100% 满意,但也不确定如何以自动化方式做到这一点。

任何帮助,将不胜感激。

小智 1

我已经使用这些命令并取得了一些成功。

git filter-branch \
  --index-filter "git rm --cached --ignore-unmatch '$1'" \
  --prune-empty --tag-name-filter cat -- --all || exit

# Cleanup and reclaming space
rm -r .git/refs/original
git reflog expire --expire=now --all
git gc --prune=now
git gc --aggressive --prune=now
Run Code Online (Sandbox Code Playgroud)

参考