将一个分支拆分成一个新的回购协议
Split out a branch into a new repo
我有一个 mercurial 存储库,现在实际上包含两个存储库。
在过去的某个时候,一个分支从 default 中分离出来(我们称之为 default-other)。
default 和 default-other 现在都有很多提交,并且没有计划合并 default-other 回到 默认值 。一些提交已从 default 移植到 default-other.
现在,我想从 default-other 分支创建一个新的 repo,同时保留完整的历史记录。即包含
的回购协议
- 从 default 到创建 default-other 分支的所有提交
- 来自 default-other
的所有提交
- 从default-other
分支出来的所有分支
- 在 default-other 被分支后 default 没有提交
最理想的是,我想针对不同的分支使用不同的策略。有些分支是必须保留的发布分支,而其他分支是我想折叠到新 default.
中的功能分支
我尝试使用转换扩展,但我不知道如何正确设置分支映射。
只需使用 described in wiki 格式的分支图。在你的情况下,这很简单
default-other default
...
renamed-child1 default
renamed-child2 default
...
加法
因为 Convert 扩展不能停止条件“之前”的转换,只能停止“之后”(参见 --rev
选项),您必须在转换过程之前为转换准备存储库(仅克隆到新的中间存储库没有 default
,只有 default-other
和后代的子集或原始变更集?)
我认为您几乎可以使用 hg strip
完成您所说的所有事情。像这样:
- 将原始仓库克隆到新仓库
hg up null
从工作目录中删除任何东西(这样使用它可能会更快)
- 确定要删除的所有分支(命名的或匿名的)和变更集。准确地说,您想要的是每个提交的变更集 ID 及其应删除的后代。
hg strip -r 12345678890
对于每个提交。这将删除提交及其所有后代(可能包括合并)。
如果需要,您可以执行此过程两次,但第二次去除正交的变更集集(那些属于 default-other 但不属于 默认).
也就是说,有几个原因您可能仍想使用 hg convert
:
存储库中有不相关的文件。例如,如果 default 分支有一些与 default-other 无关的旧内容。您可以使用 convert
删除此类文件的历史记录。
您希望 default 和 default-other 看起来总是同一个分支。您可以使用 convert
重命名其中一个或两个。 (branchmap
)
你要确保新的回购不能 pushed/pulled 与原来的可能会搞砸你所有的 well-laid 计划。通过“转换”整个 repo,IIRC 所有的变更集 ID 都将被更新,并且 repo 看起来不像原始版本的亲戚。
我的建议是分阶段工作:
- 将原件克隆到 clone1
- 使用
strip
完成尽可能多的事情
- 从克隆 1 制作克隆 2
- 运行
convert
任务 #1
- 从 clone2 制作 clone3
- 运行
convert
任务 #2
等等
我建议不要将许多不同的 convert
东西放在一起 - 运行 它们以小的增量进行。这似乎需要更长的时间,但这样更容易正确。
最终您可以删除所有中间克隆,但根据经验,我发现这是进行重大结构更改的最有效和最安全的方法。
我有一个 mercurial 存储库,现在实际上包含两个存储库。 在过去的某个时候,一个分支从 default 中分离出来(我们称之为 default-other)。 default 和 default-other 现在都有很多提交,并且没有计划合并 default-other 回到 默认值 。一些提交已从 default 移植到 default-other.
现在,我想从 default-other 分支创建一个新的 repo,同时保留完整的历史记录。即包含
的回购协议- 从 default 到创建 default-other 分支的所有提交
- 来自 default-other 的所有提交
- 从default-other 分支出来的所有分支
- 在 default-other 被分支后 default 没有提交
最理想的是,我想针对不同的分支使用不同的策略。有些分支是必须保留的发布分支,而其他分支是我想折叠到新 default.
中的功能分支我尝试使用转换扩展,但我不知道如何正确设置分支映射。
只需使用 described in wiki 格式的分支图。在你的情况下,这很简单
default-other default
...
renamed-child1 default
renamed-child2 default
...
加法
因为 Convert 扩展不能停止条件“之前”的转换,只能停止“之后”(参见 --rev
选项),您必须在转换过程之前为转换准备存储库(仅克隆到新的中间存储库没有 default
,只有 default-other
和后代的子集或原始变更集?)
我认为您几乎可以使用 hg strip
完成您所说的所有事情。像这样:
- 将原始仓库克隆到新仓库
hg up null
从工作目录中删除任何东西(这样使用它可能会更快)- 确定要删除的所有分支(命名的或匿名的)和变更集。准确地说,您想要的是每个提交的变更集 ID 及其应删除的后代。
hg strip -r 12345678890
对于每个提交。这将删除提交及其所有后代(可能包括合并)。
如果需要,您可以执行此过程两次,但第二次去除正交的变更集集(那些属于 default-other 但不属于 默认).
也就是说,有几个原因您可能仍想使用 hg convert
:
存储库中有不相关的文件。例如,如果 default 分支有一些与 default-other 无关的旧内容。您可以使用
convert
删除此类文件的历史记录。您希望 default 和 default-other 看起来总是同一个分支。您可以使用
convert
重命名其中一个或两个。 (branchmap
)你要确保新的回购不能 pushed/pulled 与原来的可能会搞砸你所有的 well-laid 计划。通过“转换”整个 repo,IIRC 所有的变更集 ID 都将被更新,并且 repo 看起来不像原始版本的亲戚。
我的建议是分阶段工作:
- 将原件克隆到 clone1
- 使用
strip
完成尽可能多的事情 - 从克隆 1 制作克隆 2
- 运行
convert
任务 #1 - 从 clone2 制作 clone3
- 运行
convert
任务 #2
等等
我建议不要将许多不同的 convert
东西放在一起 - 运行 它们以小的增量进行。这似乎需要更长的时间,但这样更容易正确。
最终您可以删除所有中间克隆,但根据经验,我发现这是进行重大结构更改的最有效和最安全的方法。