如何将mercurial配置为仅部署网站文件夹

如何将mercurial配置为仅部署网站文件夹,mercurial,tortoisehg,mercurial-subrepos,Mercurial,Tortoisehg,Mercurial Subrepos,我有一个网站,我想部署到客户端开发和UAT环境,该网站是mercurial repo的一部分-它位于与.hg文件夹相同级别的网站文件夹中。我知道我可以推送整个存储库,但宁愿只推送网站文件夹,这样客户端就不会有其他文件和文件夹 回购协议如下所示: 项目根 .hg 数据库(SQL源代码管理使用此选项) 文件(所有规格、PDF、艺术品等) Lib(Nuget之前的第三方DLL) 软件包(Nuget内容) 网站(这是我想要部署的唯一区域) .hgignore Project.sln 编辑: 客户

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

回购协议如下所示:

  • 项目根
    • .hg
    • 数据库(SQL源代码管理使用此选项)
    • 文件(所有规格、PDF、艺术品等)
    • Lib(Nuget之前的第三方DLL)
    • 软件包(Nuget内容)
    • 网站(这是我想要部署的唯一区域)
    • .hgignore
    • Project.sln
编辑: 客户端服务器没有直接连接到internet,我通过vpn和RDP访问它们。目前,要部署任何更改,我需要将站点压缩,将其放在共享ftp服务器上,然后最多等待3天,以便将文件复制到服务器。已配置规则,因此我可以在此连接上使用Mercurial

编辑2 通过忘记网站文件夹及其所有内容、提交更改然后放回文件、创建repo然后回显.hgsub文件,我成功地从网站文件夹创建了子repo。在本地,这对我来说是可行的,我可以从网站repo中克隆,而无需获得任何其他文件夹。然而,即使我在我们的repo服务器上重复这个过程,我也无法使用这个版本的repo。当我尝试将托管版本克隆到本地工作副本时,会出现404个错误,但我可以在托管服务器上克隆托管版本

我希望能得到一些关于如何实现我的目标的分步指导(如果你愿意,可以给傻瓜一个指南);只能将网站文件夹推送到客户端服务器。repo的主副本在我们的repo服务器上,我有一个本地克隆,需要能够从我的副本中推出版本

编辑3 事实证明,如中所述,我将文件夹转换为子repo时遇到的问题是,在2.1.0之后的版本中,convert命令已中断,并且在2.3.1中仍然中断。在我弄明白并返回到那个版本的TortoiseHg之后,我能够将文件夹转换为subrepo,在repo的根目录中,我有.hgsub,它表示Website=Website。我可以在本地使用它,提交整个repo,subrepo,克隆完整repo或subrepo(这是我想要的),但是我无法从我们的主repo服务器上运行它

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

请求所有更改
添加变更集
添加舱单
添加文件更改
添加了628个变更集,对4326个文件进行了6002次更改
更新到分支默认值
解析清单
调用hook preupdate.eol:
得到,忽略
获得hgsub
获取。hgsubstate
HTTP错误:404(未找到)
[命令返回代码255 Fri Apr 20 10:51:23 2012]
我不知道问题是什么,文件在那里,为什么是404

  • 您不能推送部分回购树
  • 如果开发环境和UAT环境是未版本化的目标,则可以使用任何其他方式分发Mercurial内容
  • 您可以将网站分为子回购,并且将能够推动该回购

  • 在我看来,Mercurial不应该用于此目的。如果该网站是一个web应用程序,这一点尤其正确,因为您不应该在Mercurial中使用DLL

    您应该看看内置在VisualStudio中的web部署工具。看看这一页,看看它是否适合你的目的


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

    正如其他人所指出的,你不能使用推送来实现这一点。只需从您的服务器到他们的服务器进行“rsync”。您甚至可以在钩子中实现自动化,在钩子中,您推送到本地存储库,它将自动部署到他们的站点。比如:

    [hooks]
    changegroup.deploy = $HG update ; rsync Website account@theirserver:/path/to/docroot
    

    我有一个有效的解决办法。我创建了一个批处理文件,该文件创建了一个传出的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等),然后给它一分钟时间创建我的网站文件夹,其中包含历史记录,我可以使用它从中拉取或推送。我不需要调用hgserve,因为我知道客户机服务器的名称,所以我可以通过创建别名远程存储库来推动变更集。但是我包括了这个步骤,这样客户端机器就可以拉。我还没有完全探讨过这个选项,所以我不确定它是否有什么特别的优势。如果只有我一个人在做这个项目,这是很好的,但是如果其他开发人员需要做这个,那么他们本地project server的Uri显然会有所不同(http://SIMON-PC:8000/ 不是每个人都会这样),在这种情况下,向客户推销可能是最好的

    但通过使用这种方法,我的本地工作回购协议不需要改变,因此我不会收到任何问题
    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