将Mercurial存储库移动到另一个服务器

时间:2013-05-15 01:19:47

标签: mercurial

我们有一个项目存在于一个多变量的存储库中。

我们的客户希望通过执行以下操作来获取代码库的所有权:

  1. 在属于客户的服务器上设置mercurial存储库。
  2. 将现有代码导入新的mercurial存储库。
  3. 实现第2步的最佳方法是什么?

    执行以下操作是否是一件简单的事情:

    1. 克隆现有的mercurial存储库:

      hg clone <existing mercurial repo URL>
      
    2. 将克隆的存储库推送到新存储库中:

      hg push <new mercurial repo URL>
      
    3. 我错过了任何步骤吗?那么 hgrc 文件怎么样?在将项目推送到新存储库之前是否必须以任何方式进行修改?

3 个答案:

答案 0 :(得分:7)

是的,您可以执行您所声明的内容,但值得注意的是,如果您对主存储库执行简单的hg clone,则两者之间将存在链接,这可能与您不同。您可以通过修改.hg/hgrc文件并删除default = ...部分中的[paths]项来删除此链接。

我发现更好的方法是在没有克隆的情况下进行。这样,您就没有存储库之间的链接,因为这可能是您想要的客户。

基本方法是设置一个没有变更集的新存储库,然后以三种方式之一引入所有变更集:

  1. 将更改从存储库推送到新存储库。
  2. 将更改从旧版本中拉入新存储库。
  3. 如果您无权访问新存储库,请创建一个可以提供给客户的包 - 然后可以将其拆分或拉入空存储库。
  4. 按照正常情况完成推送和拉取,但指定存储库位置:

    // create the empty repository
    hg init .
    // pull in everything from the old repo
    hg pull /projects/myOriginalRepo
    

    或推......

    // create the empty repository
    hg init /projects/myNewRepo
    cd /projects/myOriginalRepo
    hg push /projects/myNewRepo
    

    创建一个捆绑包也许是一种更好的方式,因为你可以将捆绑包写到DVD上,然后用一张漂亮的贺卡将它送到你的顾客手中:

    cd /projects/myOriginalRepo
    hg bundle --all ../repo.bundle
    

    将所有内容写入单个文件,然后可以使用hg unbundle repo.bundlehg pull repo.bundle将其解压缩到没有现有变更集的存储库中。

    关于hgrc文件,如另一个答案中已经提到的,它不是受控文件,因此不会被复制。但是,任何内容都可能是钩子来执行自动构建,或者在应用之前验证变更集。这个逻辑可能只对你自己的组织有意义,我建议你不要强加给你的客户 - 毕竟,他们拥有你的代码库,并且可能拥有自己的代码库适合这种情况的系统。

答案 1 :(得分:3)

在简单的情况下 - 一切都是。

但是如果您修改了.hg/hgrc文件,则需要手动将其移动到远程服务器,并且(如有必要)将其相应地修改为新环境。

即:您可以在原始存储库中设置挂钩。

从客户端开始 - 只需更改default部分(或任何其他部分,如果您指定了多个部分)的存储库路径

答案 2 :(得分:0)

要移动主存储库,您需要(a)创建新的主存储库并(b)告诉现有客户端。

  • 以您想要的任何方式创建新的主仓库:克隆或初始化+推送,它没什么区别。请确保在版本控制下移动 not 的旧存储库中的任何内容,包括.hgrc以及任何不可丢弃的未版本或忽略的文件。如果您克隆了,请修改新主服务器.hgrc并删除default路径,以便它不再尝试与旧的主服务器进行通信。

  • 旧主仓库的现有克隆仍然从旧主仓推/拉。每个人都必须修改自己的.hgrc,更新default(和/或default-push),使其指向新位置。 (当然,他们可能还需要更新身份验证凭据。)

只有这样才能完成迁移。删除(或移动/隐藏)原始仓库,这样如果有人忘记更新他们的仓库路径,他们就会在推/拉时出错,而不是将数据倒入内存孔。