Chr*_*phe 10 mercurial subrepos
我一直在阅读有关子存储库以及如何使用转换扩展和文件映射将现有文件夹从Mercurial存储库提取到子存储库的信息.我能成功地做到这一点.如果我有以下文件夹结构:
C:\Project
---Project\root.txt
---Project\SubFolder
---Project\SubFolder\fileinsubfolder.txt
Run Code Online (Sandbox Code Playgroud)
我可以创建SubFolder的子存储库.以同样的方式,我可以提取一切独立的存储库(在这个例子中,第二个存储库只有root.txt文件).之后,我可以将SubFolder存储库作为子存储库添加到第二个存储库.但是,尽管两个存储库都具有完整的历史记录,但这些历史记录并未链接=>将根存储库更新为较早的状态不会将子存储库置于该点应该处于的状态.更新到一致的旧版本(自动更新root和subrepo)只有在更新到已知道子库且具有.hgsubstate文件的修订版时才有效.
我想到的另一种选择就是忘记当前存储库中SubFolder中的文件,并在SubFolder中启动一个新的存储库,同时添加一个.hgsub文件.我希望在这里实现的是从这一点开始使用子存储库,但仍然有办法更新到旧版本(在分离子库之前),因为SubFolder的文件仍然在当前存储库的历史记录中.
这不起作用:当我忘记了mercurial中的文件时,在新的仓库中将其作为当前仓库中的subrepo链接并且在子流程存在之前更新为旧版本我得到此错误:
C:\Project>hg update 1
abort: path 'SubFolder\fileinsubfolder.txt' is inside repo 'SubFolder'
Run Code Online (Sandbox Code Playgroud)
这里的问题是,当更新到不知道subrepo的旧版本时,此更新想要将文件放在SubFolder中.但是这个SubFolder仍然是另一个repo(有一个.hg目录),虽然主repo没有关于它的回忆,但是更新不希望将文件放在SubFolder中,因为它是一个repo.
无论如何都可以解决这个错误,或者是否有更好的方法来切换到现有Mercurial存储库中某个文件夹的subrepo使用并保持历史记录完整(并且两个历史记录都已链接)?
不,恐怕没有任何工具可以让您按照您要求的方式拆分存储库。
只是为了澄清你的问题,然后让我们想象你有一个存储库,其中的内容root.txt和sub/file.txt演变如下
root.txt sub/file.txt`
0: root 0 file 0
1: root 1 file 1
2: root 2 file 2
Run Code Online (Sandbox Code Playgroud)
对于前三个变更集。您要求的是一个选项,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
Run Code Online (Sandbox Code Playgroud)
其中<X>、<Y>和<Z>哈希值是与子存储库中前三个提交相对应的哈希值。
目前还没有这样的选项hg convert,但基于上述内容,编写一个似乎是可行的。这将为您提供一种在组合存储库和拆分存储库之间来回转换的好方法。