1

在为使用 git 进行 Web 开发的工作流程进行了挣扎和整理之后,我的任务是在最后一秒添加一个登台服务器。我们在本地开发/测试并推送到一个 repo,现在需要一个沙箱,这样其他部门的人就可以在不破坏东西的情况下尝试新事物。

远程 repo 需要两个长期运行的分支(本着 nvie 的分支模型的精神),master 和 development。

我们需要能够推送到一个repo,并将develop分支签出到test.site.com docroot,准备好后,将develop合并到master,将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,结帐 -f 开发

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

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

将master合并回本地开发并拉取

尘埃落定后,使用 difflog 发送电子邮件,拧紧双手,喝一口浓烈的东西。

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

4

2 回答 2

2

在 git 中,您通常永远不会推送到具有结帐功能的存储库。完全没有。你可以推送到一个,除非你不能推送到签出的分支,但你通常不应该这样做。主要是为了让事情清楚地分开,并避免在 Web 服务器出现故障并需要修复时破坏中央存储库。

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

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

git fetch central-repo-url master工作副本由site.com服务器和服务器更新(好的git pull central-repo-url developtest.site.com另一个答案中建议的 fetch + reset 可能更好,因为您确定那里没有任何更改)。

通过获取 zip 或 tar 包git archive并解压缩它来更新导出。这是一个多一点的工作。

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

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

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

git checkout master git merge develop git push origin master

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

于 2011-11-30T15:25:43.197 回答
1

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

在此之后,您有两个选择

  1. 让 cron 工作为两者做类似的事情git fetch development-repo; git reset --hard development-repo/branch。我以前做过这样的事情,硬重置是必须的:它会消除任何以某种方式潜入你的 docroot 的随机更改。
  2. post-update每次有人推送某些东西时,在开发存储库中执行上述操作。不幸的是,我手头没有一个可行的例子。
于 2011-11-30T15:11:48.983 回答