0

我有一个名为“master.git”的 git 裸存储库,我定期在其中定期运行“git gc --prune=now”。

我有另一个名为“slave.git”的 git 裸存储库,它是使用“master.git”中的 --mirror 选项创建的。但是我已经停止了“git gc”并且不会运行,即使在 gitconfig 中自动关闭也是如此。

通过从 master.git -> slave.git 推送 --force --mirror 选项,使“slave.git”与“master.git”保持同步

master.git 存储库将从开发人员那里获得更改,而slave.git不会从开发人员那里获得任何更改,并且就像一个只读副本。

所以问题是,如果 master.git 存储库定期进行 GC,并且它的更改通过镜像选项推送到 slave.git,slave.git 存储库是否需要运行“git gc”以保持优化,或者因为我们正在镜像已经 GC 的存储库 slave.git 不需要垃圾收集吗?

4

2 回答 2

1

我有一个名为“master.git”的 git 裸存储库,我定期git gc --prune=now在其中运行。

这肯定是矫枉过正。例如du -sh objects在你的 gc 之前和之后的 repo 中,看看你节省了多少空间。我建议git gc --auto改为。

--force --mirror我通过使用master.git -> slave.git [...]中的选项推送来保持“slave.git”与“master.git”同步, slave.git 存储库需要一个“git gc”来运行以保持它的优化或者因为我们正在镜像一个已经被 GC 处理过的存储库 slave.git 不需要垃圾收集吗?

当您推送或获取时,新对象会打包发送。 git gc当它们太多时会合并包(现在是 50 个,从 2008 年的 20 个增加),所以最终它会变得有价值。

于 2016-12-15T07:05:04.917 回答
0

镜像方面git push --mirror意味着引用(分支和标签)以相同的名称可用,并指向与源相同的对象。这并不意味着底层数据库是一个精确的镜像。

是的,您仍然需要gc在镜像目标中,因为当旧对象被丢弃时它会积累垃圾。推送操作不会清除此类对象,因为这些对象不再存在于源中。

于 2016-12-15T06:55:17.670 回答