10

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

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

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

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

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

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

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

是否有解决此错误的方法,或者是否有更好的方法可以切换到对现有 Mercurial 存储库中的某个文件夹使用子存储库并保持历史记录完整(以及两个历史记录链接)?

4

1 回答 1

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,但基于上述,写一个听起来是可行的。这将为您提供一种在组合存储库和拆分存储库之间来回转换的好方法。

于 2011-01-06T11:04:40.323 回答