【问题标题】:How to convert an existing Mercurial repository to use subrepositories and keep the history intact?如何将现有的 Mercurial 存储库转换为使用子存储库并保持历史记录完整?
【发布时间】:2011-06-03 21:35:13
【问题描述】:

我一直在阅读有关子存储库以及如何使用转换扩展名和文件映射将现有文件夹从 Mercurial 存储库提取到子存储库的信息。我可以成功地做到这一点。如果我有以下文件夹结构:

C:\Project
---Project\root.txt
---Project\SubFolder
---Project\SubFolder\fileinsubfolder.txt

我可以创建 SubFolder 的子存储库。以同样的方式,我可以将其他所有内容提取到一个单独的存储库中(在此示例中,第二个存储库将只有 root.txt 文件)。之后,我可以将 SubFolder 存储库作为子存储库添加到第二个存储库。但是,尽管两个存储库都有完整的历史记录,但这些历史记录没有关联 => 将根存储库更新到较早的状态不会使子存储库处于此时应处于的状态。更新到一致的旧版本(自动更新根和子存储库)只有在更新到已经知道子存储库并具有 .hgsubstate 文件的版本时才有效。

我想到的替代方法是忘记当前存储库中 SubFolder 中的文件,并在 SubFolder 中启动一个新存储库,同时添加一个 .hgsub 文件。我希望在这里实现的是从这一点开始使用子存储库,但仍然有办法更新到旧版本(在分离子存储库之前),因为 SubFolder 的文件仍在当前存储库的历史记录中。

但这不起作用:当我忘记了 mercurial 中的文件时,启动了一个新的 repo 并将其链接为当前 repo 中的 subrepo,并且在 subrepo 存在之前更新到旧版本我收到此错误:

C:\Project>hg update 1
abort: path 'SubFolder\fileinsubfolder.txt' is inside repo 'SubFolder'

这里的问题是,当更新到不知道 subrepo 的旧版本时,此更新希望将文件放在 SubFolder 中。但是这个 SubFolder 仍然是另一个 repo(有一个 .hg 目录),虽然主 repo 不记得它,但更新不想将文件放在 SubFolder 中,因为它是一个 repo。

有没有办法绕过这个错误,或者有更好的方法来切换到对现有 Mercurial 存储库中的某个文件夹使用子存储库并保持历史记录完整(以及两个历史记录链接)?

【问题讨论】:

  • 那么,如果没有与@Martin 讨论的解决方案,您是如何处理的?如果子存储库位于不同的路径(与原始文件不同),“忘记”解决方案会起作用吗?就我而言,无论如何我都打算移动文件......我会发回它的进展情况。

标签: mercurial subrepos


【解决方案1】:

不,恐怕没有工具可以让您按照您的要求拆分存储库。

只是为了澄清您的问题,然后让我们假设您有一个存储库,其中 root.txtsub/file.txt 的内容像这样演变

   root.txt  sub/file.txt`
0: root 0    file 0
1: root 1    file 1
2: root 2    file 2

前三个变更集。您要求的是hg convert 的一个选项,它将把它变成两个存储库(很简单,我们今天就可以做到)并且转换扩展注入.hgsub.hgsubstate 文件,以便三个变更集包含

   root.txt  .hgsub     .hgsubstate  |       file.txt
0: root 0    sub = sub  <X> sub      |  <X>: file 0
1: root 1    sub = sub  <Y> sub      |  <Y>: file 1
2: root 2    sub = sub  <Z> sub      |  <Z>: file 2

其中&lt;X&gt;&lt;Y&gt;&lt;Z&gt; 哈希对应于子存储库中的前三个提交。

今天hg convert 没有这样的选项,但基于上述,写一个听起来是可行的。这将为您提供一种在组合存储库和拆分存储库之间来回转换的好方法。

【讨论】:

  • 这确实正是我想要的,并且非常适合拆分现有存储库。
  • 好吧,很高兴我们就问题所在达成一致......现在有人需要花时间来实现它:)
  • Martin,你知道这是否已经完成了吗?
  • @devuxer 不幸的是,我还没有听说任何人实现这个。不过,您可以尝试在 mercurial@selenic.com 邮件列表中提出建议。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-23
  • 2022-08-07
相关资源
最近更新 更多