我目前正在研究如何使用GIT post-receive hook来实现以下场景。
我有三个远程存储库位于不同的远程服务器上。
服务器A,服务器B和服务器C
我想将我的工作推送到服务器A,并且还使用服务器A上的post-receive挂钩自动执行来自服务器B和C的GIT拉取,同时更新他们的存储库。
我已经在我的本地PC上测试了这个场景,在同一台计算机上创建了三个不同的存储库来模仿三个远程服务器存储库。到目前为止,它工作正常,但是当我把这个想法应用到远程存储库时,它很难。
我想知道是否有人知道如何实现这种情况,或者您是否有任何想法或经验。
非常感谢您的帮助。
由于 Finau
答案 0 :(得分:10)
如果我正确地阅读了您的问题,Server B
和Server C
的唯一目的就是备份Server A
,对吧?
在这种情况下,您无需从Server B
告诉Server C
和pull
A
,而是从A
推送到{{1} }和B
。因此,收到后挂钩的内容将是
C
假设git push --mirror server_b
git push --mirror server_c
和server_b
已知server_c
上的遥控器。有关A
标志的说明,请参阅git push
的文档。
如果您希望--mirror
和B
成为活动部分,请定期将{cron作业设置为C
。
另一种方法是在本地仓库中定义一个具有三个URL的远程站点:
git fetch A
现在,当您通常使用[remote "multi"]
url = server_a/repo.git
url = server_b/repo.git
url = server_c/repo.git
将工作推到A
时,只需执行
git push
同时推送git push --mirror multi
,A
和B
上的所有本地广告。
另一个问题是:为什么要推到C
和B
?看起来你只是出于备份的原因这样做。您是否知道每个仓库(您的工作副本,C
上的那个,...)包含您的开发历史记录?它不像SVN,你有一个中心历史。 Git是一个DVCS,每个工作副本都有完整的历史记录。
因此,使用Git,只有在同时所有 repos被销毁时,您的历史才会丢失。否则,您将始终至少拥有一个包含项目历史记录的仓库。有关这方面的一些注意事项,另请参阅Pro Git的介绍章节。