减小Git仓库的大小

395
我试着找一个好的教程来减小仓库的大小,但是没有找到。我应该如何减小我的仓库大小?它大约有10MB,但是Heroku只允许50MB,而且我还没有完成我的应用程序开发。
我已经在.gitignore文件中添加了常见的排除项(log、vendor、doc等)。尽管我只是最近才添加了.gitignore
我该怎么办?

1
我刚刚这样做了,它把大小降到了2.2 mb...非常感谢!虽然在Heroku上似乎并没有减小存储库的大小..嗯 - sent-hil
11
使用--force选项进行推送。它将覆盖内容,即使没有更改(没有新提交等)。 - Marcin Gil
1
@MarcinGil - 下面,VonC表示您需要访问服务器来清理远程服务器(如果我解析正确的话)。 - jww
2
如果其他读者不知道该在.gitignore文件中添加什么,这里有一个很好的服务网站gitignore.io,可以根据你的开发环境帮助你设置一个好的.gitignore文件。 - Blairg23
相关(2009年):*让Git占用更少的磁盘空间* - undefined
4个回答

468

2021年2月更新,十一年后:新的git maintenance命令手册页面)应该取代git gc,并且可以计划安排执行


原文: git gc --aggressive 是强制进行修剪过程的一种方法(确保: git gc --aggressive --prune=now)。您还有其他命令来清理存储库。但是不要忘记,有时仅使用git gc就可以增加存储库的大小

它也可以在filter-branch之后使用,标记要从历史记录中删除的一些目录(进一步节省空间); 参见这里。但这意味着没有人从您的公共存储库拉取。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年第四季度)替代了已过时的 git filter-branch 或 BFG:它是一个基于 Python 的工具,需要先安装Joe 建议
# 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

2
备忘录:不要忘记远程分支:https://dev59.com/amgu5IYBdhLWcg3wing4 - VonC
2
注意事项:不要忘记远程标签。 - saiyancoder
1
除了远程引用之外,reflog 是另一件可能导致您尝试删除的引用被保留的事情。https://dev59.com/TIbca4cB1Zd3GeqPRRVN - vossad01
4
我确认这仅仅是地方操作,与远程存储库的大小无关。要执行相同的操作,您需要直接访问该远程存储库的服务器。 - VonC
1
我在我的代码库上运行了原始的gc bits。我的.git文件夹从1.7GB降至235MB。非常感谢@VonC的建议。 - Chase Florell
显示剩余6条评论

121
这是我做的事情:
git gc
git gc --aggressive
git prune

看起来这个方法似乎起了作用。我开始时大约有10.5 MB,现在只剩下980 KB左右。

11
prune 始终由 gc 运行(默认为 2 周前)。 - Cas
147
您可以使用git gc --aggressive --prune=now命令来清理Git仓库并删除不再需要的对象,这样可以同时运行三个指令。 - rahul286
5
当我删除仓库然后再次克隆时,大小仍然很大。你如何处理这个问题? - cwtuan
如果您删除本地存储库并重新克隆,则会继承远程的.git文件夹。要保留大小减小的更改,您可能至少需要先自己推送它们。如果您无法控制远程,则很遗憾,但您始终可以创建自己的分支。 - rjm27trekkie
1
运行这三个命令后,本地仓库变小了,但是运行git status将不会显示任何更新,因此无法通过git commit和git push将更改推送到远程仓库...如何缩小远程仓库? - Bruce Yang

31
在我的情况下,我上传了几个大文件(超过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上使用Homebrew(可执行文件brew)安装的工具。
brew install bfg

1
这是一个非常干净的解决方案。从其他答案中,'git gc'和'git prune'都没有帮助到我。 - Asim

1

这不会影响每个人,但仓库大小变大的半隐藏原因之一可能是Git子模块。

您可能添加了一个或多个子模块,但在某些时候停止使用它,并且一些文件仍然留在.git/modules目录中。为了赠送冗余的子模块文件,请参见this question

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

这些对仓库大小应该有很好的影响,但只要您使用Git子模块,例如使用大型库,您的仓库大小就不应该发生 drastical 变化。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接