3

我有一个要部署到客户端 DEV 和 UAT 环境的网站,该网站是 mercurial repo 的一部分 - 它位于与 .hg 文件夹相同级别的网站文件夹中。我知道我可以推送整个存储库,但宁愿推送网站文件夹,这样客户端就没有其他文件和文件夹。

回购看起来像这样:

  • 项目根
    • .hg
    • 数据库(SQL 源代码控制使用它)
    • 文档(所有规格、pdf、艺术作品等)
    • Lib (Nuget 之前的第 3 方 dll)
    • (Nuget 的东西)
    • 网站 (这是我要部署的唯一区域)
    • .hgignore
    • 项目.sln

编辑: 客户端服务器没有直接连接到互联网,我对它们的访问是通过 vpn 然后 RDP。目前要部署我需要压缩站点的任何更改,将其放在共享的 ftp 服务器上,然后等待最多 3 天,以便将文件复制到服务器。规则已配置,因此我可以通过此连接使用 Mercurial。

编辑 2 我已经设法从网站文件夹创建了一个子存储库,方法是忘记网站文件夹及其所有内容,提交更改然后放回文件,创建一个存储库然后回显 .hgsub 文件。在本地这对我有用,我可以从网站回购克隆而无需获取任何其他文件夹。但是,即使我在我们的 repo 服务器上重复该过程,我也无法使用此版本的 repo。当我尝试将托管版本克隆到我的本地工作副本时,我收到 404 错误,但我可以在托管服务器上克隆托管版本。

我将不胜感激一些关于如何实现我的目标的分步说明(如果您愿意,可以提供傻瓜指南);这是为了能够将网站文件夹推送到客户端服务器。回购的主副本在我们的回购服务器上,我有一个本地克隆,需要能够从我的副本中推出版本。

编辑 3 结果是我将文件夹转换为子存储库,如http://mercurial.aragost.com/kick-start/en/subrepositories/#converting-folder-into-a-subrepository中所述的问题是在 2.1.0 之后的版本中,转换命令已损坏,并且在 2.3.1 中仍然损坏。在我弄清楚并回滚到那个版本的 TortoiseHg 之后,我能够将文件夹转换为子存储库,在存储库的根目录中,我有 .hgsub,它显示网站 = 网站。我能够在本地使用它,提交整个 repo,subrepo,克隆完整 repo 或 subrepo(这是我想要的),但是我无法从我们的主 repo 服务器上使用它

我把整个东西压缩起来,用 ftp 传送到我们的远程主 repo 服务器,然后设置它,这样我就可以从中克隆了。直接在服务器上这工作正常(hg clone --verbose -- C:\Repositories\EM 。),但是当我尝试从服务器克隆到我的本地开发机器时(hg clone --verbose -- https:/ /myserver.com/hg/EM/。)它失败并显示“HTTP错误:404(未找到)”。

requesting all changes
adding changesets
adding manifests
adding file changes
added 628 changesets with 6002 changes to 4326 files
updating to branch default
resolving manifests
calling hook preupdate.eol: <function preupdate at 0x00000000035204A8>
getting .hgignore
getting .hgsub
getting .hgsubstate
HTTP Error: 404 (Not Found)
[command returned code 255 Fri Apr 20 10:51:23 2012]

我不知道问题是什么,文件在那里,为什么是 404?

4

4 回答 4

2

在我看来,Mercurial 不应该用于此目的。如果该网站是一个 Web 应用程序,则尤其如此,因为您不应该在 Mercurial 中拥有 DLL。

您应该查看 Visual Studio 中内置的 Web 部署工具。看看这个页面,看看它是否适合你的目的。

如果您无法在目标服务器上安装所需的服务,则可以将其配置为使用 FTP。

于 2012-03-22T20:24:52.750 回答
1
  1. 您不能推送部分回购树
  2. 如果 DEV 和 UAT 环境是未版本化的目标,您可以使用任何其他方式分发 Mercurial 内容
  3. 您可以将网站分成子仓库,并能够推送此仓库
于 2012-03-22T16:38:46.253 回答
0

正如其他人指出的那样,您不能为此使用 push 。只需从您的服务器“rsync”到他们的服务器。您甚至可以在挂钩中自动执行该操作,将其推送到本地存储库并自动部署到他们的站点。就像是:

[hooks]
changegroup.deploy = $HG update ; rsync Website account@theirserver:/path/to/docroot
于 2012-03-23T02:28:06.377 回答
0

我有一个可行的解决方案。我创建了一个批处理文件,该文件创建了一个传出 repo 并启动了内置服务器,以便我可以在客户端机器上从中提取。首先它清除前一个文件夹,然后从我的本地工作副本中克隆(有一个参数来确定它应该从哪个标签克隆)。接下来,它会创建一个地图文件并将网站文件夹转换为新的 Website2 文件夹以保留历史记录,然后删除原始文件夹并重命名新文件夹。最后,它启动了内置服务器。

cd c:\inetpub\wwwroot
rd /S /Q _ProjectName
hg clone -- C:\inetpub\wwwroot\ProjectName#%1 C:\inetpub\wwwroot\_ProjectName
cd c:\inetpub\wwwroot\_ProjectName
echo include Website > map.txt
echo rename Website . >> map.txt
hg --config extensions.hgext.convert= convert --filemap map.txt . Website2
cd Website2
hg update
cd ..
hg remove Website/*
hg commit -m "Removed Website"
rename Website2 Website
hg serve

所以它并不漂亮,但现在我只需要调用批处理文件并传递我想从(uat、dev 等)构建传出网站的标签,然后花一点时间来创建我的网站文件夹,其中包含历史记录,我可以用来拉或推。我不需要调用 hg serve 因为我知道客户端服务器的名称,所以我可以通过创建别名远程存储库来推送变更集。但我包括了该步骤,以便客户端机器可以拉动。我还没有完全探索过这个选项,所以我不确定它是否有什么特别的优势。对于只有我在处理项目的情况很好,但是如果任何其他开发人员需要处理这个问题,那么他们本地项目服务器的 Uri 显然会有所不同(http://SIMON-PC:8000/ 不会每个人都是如此),

但是通过使用这种方法,我的本地工作存储库不需要更改,因此与我们的中央存储库通信时我不会遇到任何问题,即 edit3 中提到的 404 错误。我在转换过程中保留了 repo 的整个历史记录,所以下次我需要发送更改时,我不是从修订版 1 开始 - 换句话说,它不会破坏网站,尽管我正在删除整个传出repo (_ProjectName) 每次我保留历史记录,但只能拉/推网站目录,因为它每次都是作为“独立”回购创建的

于 2012-04-26T08:26:47.203 回答