5

我们有一个项目存在于一个 mercurial 存储库中。

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

  1. 在属于客户的服务器上设置一个 mercurial 存储库。
  2. 将现有代码导入新的 mercurial 存储库。

实现第 2 步的最佳方法是什么?

执行以下操作是否很简单:

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

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

    hg push <new mercurial repo URL>
    

我错过了任何步骤吗?hgrc文件呢?在将项目推送到新的存储库之前,是否必须以任何方式对其进行修改?

4

3 回答 3

8

是的,你可以做你所说的,但是值得注意的是,如果你做一个简单hg clone的主存储库,那么两者之间将存在一个链接,这可能不是你想要的。您可以通过编辑.hg/hgrc文件并删除该部分中的default = ...项目来删除此链接[paths]

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

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

  1. 将更改从您的存储库推送到新的存储库。
  2. 将更改从旧存储库中拉入新存储库。
  3. 如果您无权访问新存储库,请创建一个可以提供给客户的捆绑包 - 然后可以将其解包或拉入空存储库。

像往常一样进行推送和拉取,但指定存储库位置:

// 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.bundle或提取hg pull repo.bundle到没有现有变更集的存储库中。

关于该hgrc文件,正如另一个答案中已经提到的那样,它不是受控文件,因此不会被复制。但是,任何内容都可能是诸如执行自动构建的钩子之类的东西,或者在应用变更集之前对其进行验证。这种逻辑可能只对您自己的组织有意义,我建议您不希望将其强加给您的客户 - 毕竟,他们拥有您的代码库的所有权,并且可能拥有自己的代码库为此类事情准备的系统。

于 2013-05-15T15:14:59.143 回答
3

在简单的情况下 - 就是这样。

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

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

作为客户端 - 只需更改一个default部分(或任何其他部分,如果您有多个指定)中的存储库路径

于 2013-05-15T01:23:44.017 回答
0

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

  • 以您想要的任何方式创建新的主存储库:克隆或初始化+推送,这没什么区别。请务必移动旧存储库中不受版本控制的任何内容,包括.hgrc任何不可丢弃的未版本控制或忽略的文件。如果您克隆了,请编辑新的 master.hgrc并删除default路径,这样它就不会再尝试与旧的 master 存储库对话了。

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

只有这样才能完成迁移。删除(或移动/隐藏)原始存储库,以便如果有人忘记更新其存储库路径,他们将在推/拉时收到错误,而不是将数据倒入内存孔中。

于 2013-05-16T11:01:39.657 回答