如何通过git push将多个分支部署到不同的目录?

sco*_*tru 6 git ruby-on-rails

在制作中,我维护了两个站点 - 测试和发布.每个都通过软链接指向不同的目录(例如)

beta_public_html -> /home/scott/myapp/trunk/public
public_html      -> /home/scott/myapp/branches/1.2.3/public
Run Code Online (Sandbox Code Playgroud)

我是一个长期的svn用户,转向git.我习惯通过svn更新部署并更改新分支上的软链接,事情非常简单.

现在我转向git.我仍然需要两个软链接(它是使用Passenger的Rails应用程序),但现在我希望它们指向两个不同的git分支("beta"和"release",比如说).我希望能够通过git push(或git pull)更新它们.

问题第1部分:我不确定最好的方法.

我开始这样做的方法是只部署到两个不同的遥控器,例如

git push ssh://scott@x.com/home/scott/myapp-beta beta
git push ssh://scott@x.com/home/scott/myapp-release release
Run Code Online (Sandbox Code Playgroud)

但这不起作用,因为默认情况下push不会更新工作树.

所以我进入远程目录并第一次运行git reset --hard,它会拉动工作树.但我再次推动,我无法得到新的推动 - 它只是停留在最初的一个.

(顺便说一句,请注意,我似乎无法推送到"myapp-beta.git" - 失败了,我必须推送到目录名.我担心这是问题的一部分,但我不知道我在这里做错了什么.)

所以,如果问题1的答案是我的方法没问题,问题第2部分:我实际上做了什么错了?如果有我应该使用的钩子,有人可以指向我吗?

(对问题1的回答说"运行这7个手动步骤"将不是一个非常有用的答案,因为svn checkout + ln -s是两个步骤.)

谢谢.我想回到编写代码.

Von*_*onC 3

《Git Push is bad than worsless》一文对类似问题进行了有趣的讨论。

其解决方案和结论之一涉及:

  • 生产服务器上的裸存储库
  • 一个克隆存储库,带有一个钩子,可以将已推送到裸存储库中的内容拉出

所以就你而言,

  • 一个裸存储库,您可以在其上推送测试版并发布分支
  • 两个克隆的存储库“beta”和“release”,带有钩子,可以从裸存储库中拉出各自的分支。

简而言之:一步:git push. 不再需要管理链接(因为该目录不再代表 Git 中的分支,与 SVN 不同)


关于钩子部分,裸仓库中的接收后钩子可能就是您所需要的

请参阅Git 提示:通过 post-receive 挂钩自动更新工作树

$ cd bare
$ chmod +x .git/hooks/post-receive

with a post-receive hook like

#!/bin/sh
cd ../../beta
env -i git reset --hard
cd ../../release
env -i git reset --hard
Run Code Online (Sandbox Code Playgroud)

笔记:

该钩子以设置为该文件夹的环境变量post-receive开始,因此无论您“进入”哪个路径,它总是会尝试在那里运行任何后续的 git 命令。 解决这个问题只需取消设置.GIT_DIRrepo/.gitcd
GIT_DIR

'env -i' 就是这样做的:它完全忽略继承的环境并仅使用提供的变量和值。