为了避免git
存储库变得太大,有时您需要git gc
在它们上运行。但这有一些缺点,特别是它会消耗大量内存。在我看来,替代解决方案就是克隆存储库并用克隆替换原始副本。 (这些是托管在服务器上的裸存储库,因此这里没有工作副本。)这会导致更多 I/O,但可能会使用更少的 RAM。
我猜这可能不会产生与 相同的效果git gc
,但我不确定如何。因此问题是:git gc
在裸存储库中运行与运行git clone
、删除存储库并用克隆替换它有什么区别?
答案1
有很多差异。
首先,为了删除和克隆,您必须假设您的存储库副本与某些远程副本完全同步,因此可以使用新克隆生成更好的打包但在其他方面等效的存储库。这种情况几乎从来不会发生,因为存储库不需要同步,并且您的本地副本可能有您想要保留的更改或分支(即使它是裸露的)。执行删除后进行克隆将丢失所有这些数据,但 agit gc
不会。
其次,您不能假设服务器本质上会在克隆上生成具有良好增量的良好包。大多数 Git 服务器会花费更多时间使用更好的设置定期打包数据,但会服务必须动态打包对象的请求,这些设置可以更快地生成数据,但打包效果较差,因为它们必须组合来自多个包和多个推送的数据。因此,自行定期重新包装可能会产生更好的结果,有时效果非常显着。
第三, agit gc
可以就地完成而不会导致中断,而克隆和替换不能在 Unix 上原子地完成(除非您使用符号链接)。 git gc
也可以根据需要自动完成,而克隆和替换则不能。
第四,如果您依靠使用引用日志的能力从错误的推送或其他错误中恢复,克隆和替换将失去这一点,而git gc
不会。
第五,根据您的网络连接,仅运行可能git gc
比克隆新副本更快。由于第二点中提到的原因,您最终可能会传输比您预期的克隆和替换更多的数据,具体取决于存储库的远程打包方式。
一般来说,我不知道有人使用克隆和替换而不是重新打包。事实上,拥有非常大的存储库的人倾向于自动获取并抢先打包以获得更好的性能,而不是一直重新克隆。