如何解决 Git GC 问题?

4
我经常遇到一个问题,我的git仓库(我想是这个原因)会决定进行垃圾回收。这个过程需要超过半个小时的时间,并且每次拉取/推送操作后都会触发。
手动运行Git GC需要半小时以上的时间,但似乎不能解决问题。我找到的唯一解决方法是删除我的仓库并重新克隆,这对于任何数量的原因都不是最佳选择。
我的Git GC操作可能很慢,因为我设置了一些内存限制,以防止它在Git GC操作时崩溃,因为当它达到4GB的Windows内存限制时就会崩溃。
任何帮助都将不胜感激。这是一个大型仓库,仓库中包含大量二进制数据,以及大量大小(>500k)的文本文件。
所以, 1. 如何限制Git决定进行垃圾回收的数量。 2. 如何加快GC操作? 3. 我能做些什么来解决或最小化涉及的更大问题(也就是为什么首先要进行垃圾回收)?

有无数个原因,为什么你不想在git存储库中拥有二进制文件(特别是如果你有很多这样的文件),主要原因是git对于二进制文件处理得不太好。这很可能是你在这里遇到问题的一个重要原因... - Romain
@Romain 很不幸,很少有源代码控制系统是免费的。特别是在“免费”领域。 - Charles Randall
有一些像git-annex和git-media这样的东西,它们旨在提高二进制文件的效率。如果这正是你想要的,那么你就需要自己去了解一下 :) - Nevik Rehnel
@CharlesRandall 这就是为什么大多数人会单独管理他们的二进制文件(特别是如果它们很大和/或很多)。 - Romain
@Romain 很遗憾,在游戏开发中,以一种与代码紧密耦合的方式对二进制数据进行版本控制非常重要,因此我们被迫滥用源代码控制系统,这可能不是它们的本意。 - Charles Randall
2个回答

2
唯一的解决方法是减小你的代码库大小。你可以通过git config --global gc.auto 0来禁用自动垃圾回收,但这会增加推送和拉取时的网络流量,如果它们仍然能够正常工作,还会增加本地磁盘空间的使用量。如果没有运行git gc,你的本地仓库将包含每个文件每个版本的完整副本。不过,如果你像在离开时每晚运行git gc这样做,那么这可能是可行的。
我建议你考虑使用git annex这样的工具,它专为类似你的情况而设计。它基本上是在你的代码库中存储大文件的指针,而不是文件本身。

0
注意:Git 2.17(2018年第二季度)的提交确实指出存在一个钩子,git gc --auto将调用该钩子,并且可以帮助最小化该命令的影响。
您可以在 "理解git gc --auto" 中了解更多关于git gc --auto的信息。
一个示例auto-gc钩子(位于contrib/中),以跳过电池上的auto-gc已经被更新为几乎始终允许运行auto-gc,除非on_ac_power命令绝对确定我们是在使用电池电源(之前,它只有在命令确定我们在使用交流电源时才会跳过)。

请参考781262c提交(2018年2月28日)由Adam Borowski (kilobyte)提交。
(已在b423234提交中被Junio C Hamano -- gitster --合并,于2018年3月14日)

hooks/pre-auto-gc-battery:允许在非笔记本电脑上运行gc

桌面和服务器通常没有电源传感器,因此on_ac_power返回255(“未知”)。 因此,除了1(“battery”)之外的任何答案都不会对运行gc造成限制。

如果该工具返回“unknown”,则查询其他来源没有意义,因为它已经查询了它们,并且比我们更聪明(可以处理多个适配器)。

因此,根据您的情况,设置该挂钩可以帮助您决定是否应执行git gc --auto


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