2011-07-30 52 views
0

我目前正在研究如何通过使用GIT post-receive hook来实现以下场景。GIT钩子post-receive和远程仓库git pull

我有三个远程存储库坐在不同的远程服务器上。

服务器A,服务器B和服务器C

我想我的工作推到服务器A,并且还使用服务器A上,收到后挂机自动执行从服务器B和C的一个GIT拉来更新他们的存储库也在同一时间。

我已经在本地PC上测试了这个场景,通过在同一台计算机上创建三个不同的存储库来模仿三个远程服务器存储库。到目前为止,它工作正常,但是当我将此想法应用于远程存储库时,这非常困难。

我想知道是否有人知道如何实现这种情况,或者如果您对此有任何想法或经验。

您的帮助将不胜感激。

感谢 Finau

回答

9

如果我正确地读你的问题中,Server BServer C的唯一目的就是备份Server A,对不对?

在这种情况下,你不必从A告诉Server BServer Cpull,而不是从A推到BC。所以,你的后收到钩的内容将是

git push --mirror server_b 
git push --mirror server_c 

假设server_bserver_c已知的A遥控器。有关--mirror标志的说明,请参阅git push的文档。

如果要使BC成为活动部件,请定期将一个cron作业设置为git fetch A


另一种方法是在具有三个URL当地的回购协议定义远程:

[remote "multi"] 
url = server_a/repo.git 
url = server_b/repo.git 
url = server_c/repo.git 

现在,当你通常使用git push把你的工作A,简单地做一个

git push --mirror multi 

同时推送您所有的本地ABC


另一个问题是:你为什么推到BC呢?这似乎只是为了备份的原因。你知道每个回购(你的工作副本,A,...)都包含你的发展的完整历史吗?这不像SVN,你有一个中心历史。 Git是DVCS,每个工作副本都有完整的历史记录。

所以,如果使用Git,你的历史将只会丢失,如果所有回购被同时销毁。否则,您将始终至少有一个包含项目历史记录的回购。有关这方面的一些说明,请参见Pro Git的介绍一章。

+0

嗨eckes,你建议是太棒了!这是我正在寻找的。非常感谢,非常感谢。关于你的问题“另一个问题是:你为什么推B和C?”我正在使用云服务器和负载平衡器。服务器A,B和C服务器具有相同的网站内容。 – Finau