始终保持git镜像同步
我有几个使用Drupal的网站,我有几台服务器,live,dev1,dev2 ......
Drupal的代码库repo很大(112Mb),所以我非常想要充分利用git的硬连接能力,这样每次添加一个站点时都不会重复这一点。
比如说,现场服务器我有一个裸机主存储库,而我的所有站点都是这样的克隆,每个都使用不同的分支。 这在一台服务器上很棒,使用硬链接,速度快,效率高。
但是在我的开发服务器上,它们通常都是裸机主存储库中的克隆,这意味着同一台计算机上的两个站点不能使用硬链接来节省空间。
我想要做的是在我的每个开发服务器上设置裸露回购的镜像,然后从中克隆。
dev1$ git clone --mirror live:master-bare-repo dev1-mirror-repo
dev1$ git clone -b site1 dev1-mirror-repo site1
dev1$ git clone -b site2 dev1-mirror-repo site2
迄今为止都很好。 但我希望镜子始终保持同步。 所以我在dev1的镜像上使用post-receive hook来做git push --mirror origin
。 现在,如果dev1上的site1推送提交,它们将被魔法推送到master-bare-repo。
但是如果我在现场服务器上做出改变并推动它呢? 我不能设置一个post-receive
钩子来推送其他的(s),因为这可能会触发它们的post-receive
钩子,最终会以递归方式结束?
有没有一些聪明的方法呢?
首先, 你不会在递归中结束 ,因为当“一切都是最新的”时(如另一个问题所述)post-receive钩子没有被执行,这将是从镜像到现场服务器。
另一方面,这不是全部的可扩展设计(每次添加新镜像时,都需要更改实时服务器的挂钩以添加要推送的站点)。 您可能会发现,在镜像中使用“懒惰”同步策略会更优雅:当他们收到推送请求时,他们不会推送给主服务器,但在此之前他们会从主服务器中取/拉。 这样您就不需要在主设备中设置挂钩,并且同步策略将完全由镜像管理。 这个策略的缺点是,你可能最终想要改变你想传播到镜像的活动服务器,然后他们需要推动任何改变。 因此,您必须思考对您的主人进行的更改对于弥补可扩展性的权衡是如此重要。 当然,正如评论中所建议的,使这种“可伸缩”设计也是“可同步”的补丁是通过使用外部cron作业来定期检查master中的变化。
链接地址: http://www.djcxy.com/p/60087.html