2011-11-30 117 views
1

在用git进行web开发的工作流程之后,我一直被委托在最后一秒添加一个临时服务器。我们在本地进行开发/测试并推出回购协议,现在需要在两者之间建立一个沙箱,以便其他部门的人员可以在周围玩耍并尝试新东西而不会破坏内容。部署git分支

远程回购需要两个长期运行的分支(本着nvie分支模式的精神),掌握和发展。

我们需要能够推到一个回购协议,并检出开发分支test.site.com文档根目录,并在准备好时,合并发展成主机和结账掌握到site.com文档根目录

所以上服务器...

git init 
git add . 
git commit -m "Initial commit" 
git checkout -b "develop" 

而且我们本地机器...

git clone [email protected]:/repos/repo1.git 
??? 
git push origin/develop (??? Updates test.site.com docroot) 

而回服务器,以使代码直播

git checkout "master" 
git merge develop (??? Updates site.com docroot) 
git checkout -b "develop" 

和当地

git pull 

帮助与赞赏问号或其他建议。

编辑: 正在尝试一些迄今为止的答案。在过渡时间里想出了一个彻头彻尾的想法,并认为我会分享:

一个post-receive hook来统治它们。

我们克隆裸露的回购和跟踪发展。推动发展/发展。

后接受 - 设置GIT_WORK_TREE到test.site.com,结账-f发展

如果提交信息中包含 “merge_master”,设置GIT_WORK_TREE到文档根目录site.com,

git checkout master 
git merge develop 
git checkout -f master (this would be for hotfixes) 

合并掌握本地发展和拉动

在尘埃落定之后,发送电子邮件difflog,拧你的手,并have一口强。

有多少种不同的方式可以打破?

+2

你见过吗? http://nvie.com/posts/a-successful-git-branching-model/ – kan

+0

是的,这实际上是我最初被介绍给git的。分支不像现在部署那样是个问题。我确实喜欢两个长期运行的分支的核心思想。 – James

回答

1

我的建议是让两个docroots都是git工作副本。

此之后,你有两个选择

  1. 有cron作业做类似git fetch development-repo; git reset --hard development-repo/branch两种。我之前做过这样的事情,而且硬重置是必须的:它会以任何方式破坏随意更改到您的文档根目录的任何更改。
  2. 在开发回购中有一个post-update挂钩,每次有人推送某物时都要做上述操作。不幸的是,我手头没有这方面的例子。
2

在git中,您通常不会推送到具有签出的存储库。完全一样。你可以推送到一个,但你不能推送到检出分支,但你通常不应该。主要是为了使事情明确分开,并避免在Web服务器崩溃并需要修复时中断中央存储库。

所以,你应该有一个(用于存储库没有工作树的术语)中央存储库。每个人都将使用该存储库。它应该存在于你的内部网络上,不应该在公共服务器或测试服务器的文档根目录下。事实上,我强烈建议不要把它放在任何一台服务器上,而是分开(可能是虚拟的)机器。

现在你有了网络服务器。它们可以是工作副本,也可以是仅使用git archive创建的导出,并且可以通过中央存储库中的cron或post-update钩子进行更新。

工作副本是由git fetch central-repo-url mastersite.com服务器上更新和git pull central-repo-url developtest.site.com服务器上(确定,取+在其他答案建议复位可能是更好的,因为你是确保你不会有任何改变那里)。

导出通过获取带有git archive的zip或tar包进行更新并解压缩。这是一个更多的工作。

Cron只是定期运行命令。设置起来更容易,但缺点是推送与服务器上显示的内容之间存在延迟。

post-update钩子设置起来比较复杂,但没有延迟(因为下载数据需要一些时间,所以显然有一些延迟)。基本上你创建一个脚本来运行更新,可以通过服务器上的ssh或web请求触发。与在中央存储库中放置脚本hooks/post-update相比,这会触发服务器上的脚本。应该没有办法给它们任何参数,并且出于安全原因,该机制不应允许运行除这些脚本以外的任何其他代码。您可以通过查看哪个分支被推送(请参阅git doc找到它的位置)并仅触发正确的服务器来使钩子更高级。

git push origin develop将导致test.site.com进行更新(但间接地,通过脚本)并且使代码住你会做(开发机器上;!从未在服务器上的工作)

git的结帐主 混帐合并开发 混帐推起源主

最后命令将导致site.com通过脚本间接地更新一次。