部署git分支

时间:2011-11-30 14:26:23

标签: git git-branch git-workflow

在使用git进行Web开发的工作流程并进行整理之后,我的任务是在最后一秒添加一个临时服务器。我们在本地开发/测试并推出回购,现在需要在它们之间设置一个沙盒,这样其他部门的人们就可以在不破坏东西的情况下玩游戏并尝试新事物。

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

我们需要能够推送到一个repo,并将开发分支签出到test.site.com docroot,并在准备好后,合并开发成master和checkout master到site.com docroot

所以在服务器上......

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

在我们当地的机器上......

git clone user@site.com:/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

帮助提出问号或其他建议。

修改 到目前为止,我正在尝试一些答案。在过渡期间提出了一个完全愚蠢的想法,我想分享:

一个接收后的钩子来统治它们。

我们克隆一个裸仓库并跟踪开发。推动发展到原点/发展。

收到后 - 将GIT_WORK_TREE设置为test.site.com,checkout -f develop

如果提交消息包含“merge_master”,请将GIT_WORK_TREE设置为site.com docroot,

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

合并主人回到开发和拉动本地

尘埃落定之后,发送带有difflog的电子邮件,拧干你的手并喝一口强烈的东西。

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

2 个答案:

答案 0 :(得分:2)

在git中,您通常不会推送到具有结帐的存储库。完全没有。您可以推送到一个,除非您无法推送到已检出的分支,但您通常不应该。主要是为了使事情清楚地分开,并避免在Web服务器中断并需要修复时中断中央存储库。

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

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

工作副本由git fetch central-repo-url master服务器上的site.comgit pull central-repo-url develop服务器上的test.site.com更新(好的,其他答案中建议的提取+重置可能更好,因为你确定你没有任何改变。)

通过使用git archive获取zip或tar包并将其解压缩来更新导出。这是一项更多的工作。

Cron只是定期运行命令。设置起来比较容易,但缺点是推送和服务器上出现的内容之间存在延迟。

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

git push origin develop将导致test.site.com更新(但间接地,通过脚本)并使代码生效(在开发机器上; 从不在服务器上工作!)

git checkout master    git merge develop    git push origin master

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

答案 1 :(得分:1)

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

在此之后你有两个选择

  1. 让cron工作为git fetch development-repo; git reset --hard development-repo/branch做两件事。我以前做过这样的事情,硬重置是必须的:它会以任何方式核对任何随机变化,这些变化已经悄悄进入你的docroot。
  2. 每当有人推动某事时,在开发回购中有一个post-update钩子做上述事情。不幸的是,我手边没有这方面的实例。