始终保持git镜像同步

始终保持git镜像同步,git,mirroring,Git,Mirroring,我有几个使用Drupal的网站,我有几个服务器,live,dev1,dev2 Drupal的代码库repo很大(112Mb),所以我很想充分利用git的硬链接功能,这样每次我添加一个站点时,它就不会重复这个功能 所以,比如说,我的实时服务器有一个裸主repo,我所有的站点都是它的克隆,每个都使用不同的分支。这是伟大的一个服务器,硬链接的使用,它的快速和高效 但在我的开发服务器上,它们通常都是从裸主机repo克隆的,这意味着同一台机器上的两个站点不能使用硬链接来节省空间 我想做的是在我的每个开发服

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

Drupal的代码库repo很大(112Mb),所以我很想充分利用git的硬链接功能,这样每次我添加一个站点时,它就不会重复这个功能

所以,比如说,我的实时服务器有一个裸主repo,我所有的站点都是它的克隆,每个都使用不同的分支。这是伟大的一个服务器,硬链接的使用,它的快速和高效

但在我的开发服务器上,它们通常都是从裸主机repo克隆的,这意味着同一台机器上的两个站点不能使用硬链接来节省空间

我想做的是在我的每个开发服务器上设置一个裸repo镜像,然后从中克隆

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的mirror上使用了
git-push--mirror-origin
。现在,如果dev1上的site1推送提交,它们将神奇地推送到主裸repo

但是如果我在live服务器上做了一个更改,并推动该更改,该怎么办?我无法设置一个
post-receive
钩子来推送到其他钩子,因为这可能会触发它们的
post-receive
钩子,而这些钩子最终会以递归方式结束


有什么聪明的方法解决这个问题吗?

首先,你不会以递归结束,因为当“一切都是最新的”(如中所述)时,post receive钩子不会执行,这将是从镜像推送到实时服务器的结果


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

后台进程是否会定期尝试从实时服务器拉入并推送到实时服务器(而不是接收后)?还有,试试看,但我不认为你会被你的方法困在一个循环中,因为你第二次尝试推送另一台服务器时没有收到任何东西,因为没有任何东西可以推送。这听起来好像是可行的!谢谢我会试一试,测试完后再勾选答案。