2011-04-22 70 views
2

我对Git只有一点新意,我只用它来进行基本的项目和简单的设置。现在我正在努力将自己的头围绕更复杂的设置。我一直在搜索谷歌搜索,但我无法找到任何与我想如何设置相关的内容。Git根据分支推送自动推送到中央存储库的开发和生产

我在我的网络上有三台服务器:一台用于开发(dev.example.com),一台用于生产(www.example.com),另一台充当中间阶段(central.example.com) )。

我想创建一个主要的(可能是裸机的)Git仓库,我可以从我的本地机器(它与三台主服务器分开,但在同一网络上)推送到中央。理想情况下,这个回购将有两个分支:主和发展。我的本地机器只能处理Central的这个回购。

当我推送到Central上的开发分支时,Central应该将这些更改推送到DEV服务器。同样,对主分支的更改应推送到WWW。我认为使用提交/更新挂钩将是完成此操作的最佳方式。

这里是一个粗略绘制图:

Local 
    | 
Central 
/ \ 
DEV WWW 

可能有人亲切地指出我在正确的方向?谢谢!

+0

我碰到了[this hook](https://gist.github.com/634631),看起来它可以让我推送到一个非裸存储库,或者换句话说WWW和DEV。有什么异议? – 2011-04-22 15:55:47

+0

这篇文章:http://blog.ekynoxe.com/2011/10/22/git-post-receive-for-multiple-remote-branches-and-work-trees/解释得非常好 – tver3305 2012-08-07 13:43:21

回答

3

您必须使用post-updatepost-receive挂钩;它们是在推送到存储库完成后运行的。他们之间唯一的区别是他们如何得到论据。

比我建议使用SSH触发生产/登台服务器TU从那里运行一拉,这是因为:

  • 您需要反正那里运行一些代码,因为推入混帐不支持检查远端的推送版本。所以你需要另一个钩子。
  • 在那里进行推送意味着允许推送访问,这意味着还有一件事要保护。另一方面,ssh触发器会将硬编码分支拉出来,所以没有人会对它造成任何伤害,除非中央存储库也受到损害,并且更重要的是,即使存在潜在危害,也仅限于欺骗它以拖动不良版本,但没有数据可以被删除,因此不能访问计算机的其他部分。

一个SSH触发器是一个脚本,即与SSH(前缀.ssh/authorized_keyscommand=触发公钥)特定公钥相关联。当您使用该密钥登录ssh时,ssh将忽略客户端提供的命令并运行触发器。这可以在有人窃取密钥时限制可能的损害,因为触发器可以使用自己的逻辑知道该做什么,并且不接受来自客户端的任何输入。

或者,您可以简单地推送并安装适当的挂钩来检出。请参阅this question

2

您可以在Git中设置钩子以轻松获得您想要的东西。利用-收到后挂机,接收从标准输入以下内容:

<oldrev> <newrev> <refname>

例子:

aa453216d1b3e49e7f6f98441fa56946ddcd6a20 68f7abf4e6f922807889f52bc043ecd31b79f814 refs/heads/master

使用refname,你可以在你的脚本什么的分支被推看并推动到适当的回购 - www或dev。

或者,你可以使用post-update钩接收 refname,也可以作为一个参数做同样的事情。

为了完整起见,挂钩必须放置在中央仓库的挂钩中。