2

我只是对 Git 有点陌生,我只将它用于具有简单设置的基本项目。现在我正在努力解决一个更复杂的设置。我整晚都在谷歌上搜索,但我找不到任何与我想如何设置有关的东西。

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

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

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

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

 Local
   |
 Central
  /   \
DEV   WWW

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

4

2 回答 2

3

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

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

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

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

或者,您可以简单地推动并安装适当的挂钩来签出。看到这个问题

于 2011-04-22T07:54:39.883 回答
2

您可以在 Git 中设置挂钩,以便在此处轻松获取所需内容。利用 post-receive 钩子,它从标准输入接收以下内容:

<oldrev> <newrev> <refname>

例子:

aa453216d1b3e49e7f6f98441fa56946ddcd6a20 68f7abf4e6f922807889f52bc043ecd31b79f814 refs/heads/master

使用refname你可以在你的脚本中看到被推送到哪个分支,然后推送到适当的 repo - www 或 dev。

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

为了完整起见,钩子必须放在 Central repo 的钩子中。

于 2011-04-22T09:37:56.757 回答