如何缩小.git文件夹


134

我目前的基地总规模约为 200MB。

但是我的.git文件夹的大小却惊人的5GB(!)。由于我将工作推送到外部服务器,因此不需要任何重要的本地历史记录...

如何缩小.git文件夹以释放笔记本上的一些空间?我可以删除所有早于30天的更改吗?

非常感谢您的帮助:)


2
您可以发布的输出git count-objects -v吗?
CB Bailey

Answers:


113

您不应该删除所有超过30天的更改(我认为使用git是有可能的,但实际上不建议这样做)。

您可以调用git gc --aggressive --prune,这将在存储库中执行垃圾回收并修剪旧对象。您是否有很多经常更改的二进制文件(存档,图像,可执行文件)?这些通常会导致巨大的.git文件夹(请记住,git为每个修订版存储快照,二进制文件压缩严重)


32
实际上,这git gc --aggressive被认为是不好的做法。最好使用git repack -a -d --depth=250 --window=250
Artefact2

18
@knittl:绝对。这是莱纳斯本人的信息:gcc.gnu.org/ml/gcc/2007-12/msg00165.html
Artefact2

3
@ artefact2:感谢您的链接!我已阅读它,并且linus指出,--aggressive不会重用(好的)增量-在此问题中似乎不存在,因为存储库很大。使用重新打包的方式实际上将花费更长的时间。git gc --aggressive调用重新打包窗口大小为250(参见手册页),深度为250(参见源代码)。--aggressive另外添加了该-f开关,以丢弃并重做所有先前的增量操作(如链接中所述)
knittl 2011年

1
我刚刚使用git-remote-hg 签出了hg.nginx.org/nginx存储库(RELEASE-1.4.0是提示),这产生了大约100MB的存储库。使用git gc --aggressive --prune将其减少到19MB。
Lekensteyn

15
@ Artefact2您的声明已过时请注意该帖子的年龄。实际上,在发布的同一天,邮件列表上的讨论导致了该提交:[..]因此,这两种方法中的包装参数如今都相同。--prune也不必这样做,因为它自从成为默认值以来v1.5.5-rc0(commit 25ee973,2008年3月)。
Lekensteyn

68

这是git Linus的创建者对如何缩小git repo的评价:

等价于“ git gc --aggressive”-但是*正确地*-是要做的(过夜)

   git repack -a -d --depth=250 --window=250

深度是关于增量链可以有多深(在较长的历史中使它们更长-这是值得的空间开销),而窗口是关于我们希望每个增量候选对象扫描多大的对象窗口。

在这里,您可能要添加“ -f”标志(即“删除所有旧的增量”),因为您现在实际上是在尝试确保此人确实找到了合适的人选。

来源:http//gcc.gnu.org/ml/gcc/2007-12/msg00165.html

这会摆脱掉我仓库中孤立的二进制数据吗?“ git repack”不会删除已检入存储库然后删除的图像或二进制数据。要从您的仓库中永久删除此类数据,您必须重新编写历史记录。一个常见的例子是当您不小心在git中输入密码时。您可以返回并删除一些文件,但是从那以后到现在,您必须重新编写您的历史记录,然后强制将新的回购推送到您的来源。


对我来说.git文件夹大约是1.5G。我试过了,但是出现错误。 fatal: Out of memory, malloc failed (tried to allocate 39763130 bytes)
米龙

2
repack本地执行,进行提交和推送之后,收缩也会被远程化吗?
Timo

@David Dehghan:嘿,我从项目目录尝试了此操作,但是.git文件夹的大小没有变化。这是预期的,还是我需要推动以查看更改?(对不起,git经验不是很丰富。)我在回购中有一个图像/ gif,并且提交了该图像的不同版本的数倍,并且我想增加了.git的大小。
giorgim

嗨,很遗憾,现在这是您清理旧二进制版本的方式。为此,您需要重写您的历史记录,这实际上很复杂。下面是一些领导对你:docs.microsoft.com/en-us/azure/devops/articles/...
大卫Dehghan

22

我尝试了这些,但是我的存储库仍然很大。问题是我不小心检查了一些生成的大文件。经过一番搜索,我发现了一个很棒的教程,可以轻松删除生成的大型文件。本教程使我可以将存储库从60 MB缩减到<1 MB。

Steve Lorek,如何缩小Git存储库


4
是链接腐烂的情况下的存档版本。这个答案对/对回购很有帮助,我遇到了提交.exe和.zip文件的地方,这些文件使.git文件夹的大小膨胀了
doubleDown '18

9

5GB和200MB比较奇怪。尝试运行git gc

但是不可以,除非您将存储库拆分为模块,否则无法减小.git目录的大小。

git repo的每个克隆都是可以充当服务器的完整存储库。这就是分布式版本控制的基本原理。


3

与版本历史相比,我更多地使用git作为同步机制。因此,针对此问题的解决方案是确保所有当前源都处于令人满意的状态,然后删除.git并重新初始化存储库。磁盘空间问题已解决。:-)历史消失了:-(之所以这样做,是因为我的存储库位于一个小的USB闪存盘上。我不需要或不需要整个历史记录。如果我有一种仅能截断历史记录的方法,则可以使用它。

如果我有兴趣保留自己的历史记录,则可以存档当前存储库。稍后,我可以克隆原始存储库,复制新存储库中的所有更改(假设我没有做太多(任何)重命名或删除操作)。然后进行一次大提交,将新仓库中所做的所有更改表示为旧仓库中的一次提交。是否可以合并历史记录?也许如果我使用了一个分支然后删除了不需要的对象。(我对git内部没有足够的了解,无法像这样开始鬼混)。


1
您可以仅在此用例中使用Dropbox。我做了很多年。
乔尼

0

在上述方法中尝试过,在我的情况下(在git push期间不小心杀死git进程)没有任何效果,因此我最终不得不删除该repo并再次克隆它,现在.git文件夹大小正常。


我必须使用相同的解决方案,因为我的磁盘已满(.git文件夹> 90 GB),所以我什至无法运行repack或git gc!
Fl4v
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.