![服务器上的存储库文件结构](https://linux22.com/image/518688/%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%B8%8A%E7%9A%84%E5%AD%98%E5%82%A8%E5%BA%93%E6%96%87%E4%BB%B6%E7%BB%93%E6%9E%84.png)
对于每个公共服务器,我们有三个阶段:开发、测试和生产。每个阶段都是一个 Web 服务器。我在 Mercurial 中使用命名分支来补充此过程。诀窍是将正确版本的内容推送到正确的服务器,即在运行发布测试的脚本时,测试分支将被推送到测试 Web 服务器。
我已经搞定了钩子和所有细节。我不确定的部分是 Mercurial 文件结构。我想使用 RSync 实现发布过程,为此我需要一个本地文件夹来同步,这个文件夹可以是我在服务器上创建存储库的文件夹,但我需要确认的是存储库的服务器版本是否可以与我想要的任何分支保持同步。
即我在测试中创建一个存储库
cd test
hg init
touch sample
hg add ./*
hg commit -m "whatever" -u someowner
现在假设我从工作站完成大量工作并将更改提交到存储库,从而创建两个命名分支test
和prod
。我关心的是实际的测试目录。我可以让该目录包含某个命名分支的最新版本(在我进行上述初始化的服务器上),而不会损害存储库本身吗?
鉴于我是 Mercurial 的新手,请考虑这一点。
答案1
如果我正确理解了场景和问题,那么答案是“是”。
让我解释一下我认为你在问什么:你在某处托管了一个 Mercurial 存储库,并且你在这个存储库中有三个命名分支。我假设它们名为default
、test
和prod
。开发人员将更改推送到存储库中。
您希望将代码发布到三个不同的 Web 服务器上,我们将它们分别称为web-default
、web-test
和web-prod
。 您希望rsync
为此使用 。
这一切都是非常合理的设置。主要问题是你是否可以运行
$ hg update test
$ rsync -av --exclude .hg . web-test:/var/www
在服务器存储库上,以及它是否会影响未来的推送。答案是“是”,您可以将工作副本更新为您想要的任何修订版本 — 推送到服务器的变更集不会受到任何影响。
因此,你可以在服务器上创建三个钩子,如下所示:
[hooks]
changegroup.default = hg update default && rsync ... web-default:/var/www
changegroup.test = hg update test && rsync ... web-test:/var/www
changegroup.prod = hg update prod && rsync ... web-prod:/var/www
每当有人向存储库推送内容时,这将把每个分支的提示发布到相应的 Web 服务器上。希望这对你有帮助!