如何将现有的Mercurial存储库转换为使用子存储库并保持历史记录不变?

时间:2011-01-05 09:23:58

标签: mercurial subrepos

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

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

我可以创建SubFolder的子存储库。以同样的方式,我可以提取一切单独的存储库(在这个例子中,第二个存储库只有root.txt文件)。之后,我可以将SubFolder存储库作为子存储库添加到第二个存储库。但是,尽管两个存储库都有完整的历史记录,但这些历史记录并未链接=>将根存储库更新为较早的状态不会将子存储库置于该点应该处于的状态。更新到一致的旧版本(自动更新root和subrepo)只有在更新到已知道子库且具有.hgsubstate文件的修订版时才有效。

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

这不起作用:当我忘记了mercurial中的文件时,在新的仓库中添加了一个新的仓库并将其作为当前仓库中的subrepo链接,并且在subrepo存在之前我更新到旧的版本我得到了这个错误:< / p>

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

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

是否存在解决此错误的问题,或者是否有更好的方法可以切换到使用现有Mercurial存储库中某个文件夹的subrepo并保持历史记录不变(并且两个历史记录都已关联)?

1 个答案:

答案 0 :(得分:4)

不,我担心没有工具可以让你按照你要求的方式拆分存储库。

为了澄清您的问题,让我们假设您有一个存储库,其中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

其中<X><Y><Z>哈希值是与子存储库中前三个提交相对应的哈希值。

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