我对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
有人能指出我正确的方向吗?谢谢!
答案 0 :(得分:3)
您必须使用post-update
或post-receive
挂钩;它们是推送到存储库完成后运行的那些。他们之间唯一的区别就是他们如何获得论据。
我建议在生产/登台服务器上使用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
挂钩以及参数来执行相同的操作。
为了完整起见,必须将钩子放在中央仓库的钩子中。