我试图寻找一个关于减少回购大小的好教程,但没有找到。我如何减少我的回购规模…它大约是10 MB,但问题是Heroku只允许50 MB,我还没有完成我的应用程序的开发。

我已经添加了通常的嫌疑(日志,供应商,文档等)到。gitignore。虽然我最近才添加了。gitignore。

有什么建议吗?


当前回答

谢谢你的回复。以下是我所做的:

git gc
git gc --aggressive
git prune

这似乎奏效了。我一开始只有10.5MB,现在只有980kb多一点。

其他回答

这应该不会影响到每个人,但是存储库大小较大的一个半隐藏原因之一可能是Git子模块。

您可能已经添加了一个或多个子模块,但在某个时候停止使用它,并且一些文件仍然保留在.git/modules目录下。要给出多余的子模块文件,请参阅这个问题。

然而,就像主存储库一样,另一种方法是导航到.git/modules中的子模块目录,并执行,例如,git gc——aggressive——prune。

这些应该对存储库的大小有很好的影响,但只要你使用Git子模块,例如,特别是大型库,你的存储库大小应该不会有很大的变化。

谢谢你的回复。以下是我所做的:

git gc
git gc --aggressive
git prune

这似乎奏效了。我一开始只有10.5MB,现在只有980kb多一点。

11年后的2021年2月更新:新的git维护命令(手册页)应该取代git gc,并且可以调度。


原始:git gc—aggressive是一种强制修剪过程发生的方法(确保:git gc—aggressive—prune=now)。您还可以使用其他命令来清理回购。但是不要忘记,有时候git gc本身会增加repo的大小!

它也可以用在过滤器分支之后,标记一些目录从历史记录中删除(进一步获得空间);在这里看到的。但这意味着没有人会从你的公开回购中撤资。Filter-branch可以在.git/refs/original目录下保存备份引用,这样也可以清理该目录。

最后,正如在这篇评论和这个问题中提到的;清理reflog可以帮助:

git reflog expire --all --expire=now
git gc --prune=now --aggressive

一个更完整,但也可能更危险的解决方案是从git存储库中删除未使用的对象


注意,git filter-repo现在(git 2.24+, 2019年Q4)取代了过时的git filter-branch或BFG:它是一个基于python的工具,需要先安装。

乔·建议:

# Find the largest files in .git:
git rev-list --objects --all | grep -f <(git verify-pack -v  .git/objects/pack/*.idx| sort -k 3 -n | cut -f 1 -d " " | tail -10)

# Strat filtering these large files:
git filter-repo --path-glob '../../src/../..' --invert-paths --force
#or
git filter-repo --path-glob '*.zip' --invert-paths --force
#or
git filter-repo --path-glob '*.a' --invert-paths --force

git remote add origin git@github.com:.../...git
git push --all --force
git push --tags --force

在我的例子中,我推送了几个大文件(> 100Mb),然后继续删除它们。但它们仍然在我的回购历史中,所以我必须将它们从它中删除。

诀窍在于:

bfg -b 100M  # To remove all blobs from history, whose size is superior to 100Mb
git reflog expire --expire=now --all
git gc --prune=now --aggressive

然后,你需要在你的树枝上用力:

git push origin <your_branch_name> --force

注意:bfg是一个可以在Linux和macOS上使用brew安装的工具:

brew install bfg