在Mercurial中,如何组合不相关的存储库,只留下一个根?
我有一个项目的4个版本。版本1-3是最初不受源代码控制的“原型”(它们在文件系统中作为单独的目录存在)。版本4从一开始就受源代码控制,现在有很长的提交历史 我想结合这些,使版本1-3成为单独的变更集,其中每个变更集都是前一个版本的后代。版本4的根应该成为版本3的后代(当然,版本4的历史不会崩溃) 所有的更改都是私有的,而不是公开的(重写历史并没有问题) 到目前为止我所做和尝试的:在Mercurial中,如何组合不相关的存储库,只留下一个根?,mercurial,rebase,Mercurial,Rebase,我有一个项目的4个版本。版本1-3是最初不受源代码控制的“原型”(它们在文件系统中作为单独的目录存在)。版本4从一开始就受源代码控制,现在有很长的提交历史 我想结合这些,使版本1-3成为单独的变更集,其中每个变更集都是前一个版本的后代。版本4的根应该成为版本3的后代(当然,版本4的历史不会崩溃) 所有的更改都是私有的,而不是公开的(重写历史并没有问题) 到目前为止我所做和尝试的: 1.我在原型版本目录中设置了新的hg存储库 2.我克隆了版本4的存储库 3.我(使用hgpull--force)将版
1.我在原型版本目录中设置了新的hg存储库
2.我克隆了版本4的存储库
3.我(使用
hgpull--force
)将版本1-3的无关存储库拉入克隆存储库
这在单个存储库中为我提供了4个不相关的“根”(没有祖先的变更集)。当我把它们组合在一起时,我不想记住这4个根hg-rebase
应该允许我移动变更集并销毁原始变更集,这与hg-merge
不同
在这里,我将使用101
作为“版本1”(这是一个没有父项的单一变更集)的修订版,使用102
作为“版本2”的修订版
尝试1:我尝试hg-rebase-b102-d101
,但得到的响应没有任何内容要重新设置
。这大概是因为他们没有共同的祖先(我觉得这是不一致的…-b102
将包括除共同祖先以外的所有祖先,在这种情况下,这将不算什么。)
尝试2:我尝试hg-rebase-s102-d101
。这会导致合并冲突。我使用hg revert--all--rev 102
和hg resolve-m
来表示我在所有冲突中都更喜欢“版本2”(尽管我想知道在存在添加/删除时,这是否真的是一种正确的方式来偏好一个父级而不是另一个父级?)。但当我提交时,我没有线性历史记录——修订版102
仍然存在 如果我使用hg-rebase--continue
作为最后一个命令(而不是hg-commit
),那么它工作得很好
我没有阅读文档的最后一部分:据我所知,在重定基址时最好使用
--tool“internal:other”
,而不是恢复到修订版。重定基址的另一种方法对我有效,就是使用hg convert
扩展名和--sitemap
选项
尽管convert
旨在实际从其他源代码管理系统(如SVN)迁移,但它也可以从hg“转换”到hg
“--spitchemap”选项允许您显式设置变更集之间的子/父关系。我用它来消除来自无关存储库的分支。Mercurial似乎能够很好地处理这一问题,例如,在转换/拼接映射操作之后,具有相同名称的文件似乎具有连续的历史记录
我不确定这是否一定是一个比重设基础“更好”的解决方案。对于奇数情况,这可能更像是一种小生境方法(?)。一个明显的缺点是,对于大型存储库,转换过程可能需要相当长的时间才能运行
.如果在执行合并、重设基础或移植时存在合并冲突,则应在将其标记为已解决之前手动解决这些冲突。在我的例子中,
hg revert--all--rev 102
是我想要“手动”解决冲突的方式@Ein,“文档的最后一部分”的具体部分是什么,是解决这一问题的关键?感谢可能的副本