2011-01-05 69 views
10

我一直在阅读有关子库以及如何使用convert扩展名和filemap从Mercurial存储库中将现有文件夹提取到子库。我可以成功地做到这一点。如果我有以下文件夹结构:如何将现有的Mercurial存储库转换为使用子存储库并保持历史记录不变?

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

我可以创建一个SubFolder子库。与我可以用其他方法提取所有其他单独的存储库(在本例中,第二个存储库只包含root.txt文件)完全相同。之后,我可以将SubFolder存储库作为子库添加到第二个存储库。但是,虽然这两个存储库都有完整的历史记录,但这些历史记录并未链接=>将根存储库更新为较早的状态不会使子存储库处于它应该处于该状态的状态。更新到一致的旧版本(自动更新根和子版本)只有在更新到已知有子版本并具有.hgsubstate文件的版本时才会起作用。

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

虽然这不起作用:当我忘记了mercurial中的文件时,引入了一个新的repo并将其作为当前repo中的subrepo链接,并且在subrepo存在之前更新为较旧的修订版本时出现此错误:

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

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

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

+0

那么,如果没有使用@Martin讨论的解决方案,你是如何处理这个问题的?如果subrepo位于不同的路径(比原始文件),“忘记”解决方案是否会工作?就我而言,我打算移动这些文件......我会回过头来看看它是如何发展的。 – harpo 2011-03-01 19:31:08

回答

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选项,但是基于上面这个,听起来是可行的。这会给你一个很好的方式来在组合库和分割库之间来回转换。

+0

这确实正是我想要的,并且完美地分割现有的存储库。 – Christophe 2011-01-06 15:43:39

+2

对,很高兴我们同意问题是什么......现在有人需要花时间实施它:) – 2011-01-07 14:23:34

+0

马丁,你会知道这是否已经完成? – devuxer 2014-01-30 23:05:55

相关问题