Git根据推送的分支自动从Central Repository推送到Dev和Production

时间:2011-04-22 07:42:43

标签: git production staging

我对Git有点新,我只用它来进行简单设置的基本项目。现在我正在努力绕过一个更复杂的设置。我已经玩了一整夜谷歌搜索,但我找不到任何与我想如何设置相关的内容。

我的网络上有三台服务器:一台用于开发(dev.example.com),一台用于生产(www.example.com),另一台用作两者之间的中央舞台(central.example.com)

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

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

这是一张粗略绘制的图表:

 Local
   |
 Central
  /   \
DEV   WWW

有人能指出我正确的方向吗?谢谢!

2 个答案:

答案 0 :(得分:3)

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

我建议在生产/登台服务器上使用ssh触发器从那里运行拉动,因为:

  • 无论如何你需要在那里运行一些代码,因为push in git不支持检查远程端的推送版本。所以你需要另外一个钩子。
  • 在那里运行推送意味着允许在那里进行推送访问,这意味着还有一件事需要保护。另一方面,ssh触发器将有硬编码分支拉,所以除非中央存储库也受到损害,否则没有人可以对它做任何伤害,更重要的是,即使它是,潜在的伤害仅限于欺骗它来拉坏版本,但不能删除任何数据,也无法访问计算机的其余部分。

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

或者你可以简单地推送并安装适当的钩子来检查。请参阅this question

答案 1 :(得分:2)

你可以在Git中设置钩子,轻松搞定你想要的东西。使用post-receive hook,它从stdin接收以下内容:

<oldrev> <newrev> <refname>

示例:

aa453216d1b3e49e7f6f98441fa56946ddcd6a20 68f7abf4e6f922807889f52bc043ecd31b79f814 refs/heads/master

使用refname,您可以在脚本中看到正在推送的分支,并将其推送到相应的仓库 - www或dev。

或者,您可以使用仅接收 refname的post-update挂钩以及参数来执行相同的操作。

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