始终保持git镜像同步

art*_*bot 7 git mirroring

我有几个使用Drupal的站点,我有几个服务器,live,dev1,dev2 ......

Drupal的代码库回购很大(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
Run Code Online (Sandbox Code Playgroud)

到目前为止都很好.但我希望镜子始终保持同步.所以我在dev1的镜像上使用了post-receive hook来做git push --mirror origin.现在,如果dev1上的site1推送提交,它们会被神奇地推送到master-bare-repo.

但是,如果我在实时服务器上进行更改并推送它呢?我不能设置一个post-receive钩子推送到其他人,因为这可能会触发他们的 post-receive钩子,最终会递归?

这有什么聪明的方法吗?

小智 4

首先,您不会以递归结束,因为当“一切都是最新的”(如另一个问题中所述)时,接收后挂钩不会执行,这将是推送的结果镜像到实时服务器。

另一方面,这并不是可扩展设计的全部(每次添加新镜像时,您都需要更改实时服务器的挂钩以添加要推送的站点)。您可能会发现在镜像中使用“惰性”同步策略更加优雅:当它们收到推送时,它们不仅推送到主服务器,而且在此之前它们从主服务器获取/拉取。这样你就不需要在主服务器中设置钩子,同步策略将完全由镜像管理。此策略的缺点是,您最终可能希望对实时服务器进行更改,并在镜像需要推送任何更改之前将其传播到镜像。因此,您必须考虑对主控的更改对于补偿可扩展性的权衡是否如此重要。当然,使这种“可扩展”设计也“可同步”的补丁是使用外部 cron 作业定期检查 master 中的更改,如评论中所建议的。