我一直在阅读有关子存储库以及如何使用转换扩展和文件映射将现有文件夹从 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 仍然是另一个存储库(有一个 .hg 目录),尽管主存储库没有关于它的记忆,但更新不想将文件放入 SubFolder,因为它是一个存储库。
是否有办法解决此错误,或者是否有更好的方法可以切换到对现有 Mercurial 存储库中的某个文件夹使用子存储库并保持历史记录完整(并且两个历史记录都链接)?
不,恐怕没有任何工具可以让您按照您要求的方式拆分存储库。
只是为了澄清你的问题,然后让我们假设你有一个存储库,其中的内容root.txt
and sub/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
and .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>
, and <Z>
哈希值是与子存储库中前三个提交相对应的哈希值。
没有这样的选项hg convert
今天,但基于上述内容,写一个听起来是可行的。这将为您提供一种在组合存储库和拆分存储库之间来回转换的好方法。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)