我能分割一个Mercurial代码库吗?

55

我有一个相对较大的Mercurial存储库,决定将其拆分为多个较小的存储库。是否有一种方法可以拆分存储库并使每个部分保留其修订历史记录?

3个回答

54

最佳方法是使用 convert 扩展。你将会使用 Mercurial 和源和目标类型,然后使用像这样的 --filemap 条目:

exclude path/you/do/not/want
rename path/you/do/want .

只有在您想把保留的部分移到目录层次结构“更高”的位置时,才需要重命名。


4
无法实现:重命名路径/您/想要/的/ 可以实现:重命名路径/您/想要。 这仅适用于将路径移动到根目录的情况。 - Nathan Lee
8
更好的做法是将exclude ...这一行替换为include path/you/do/want,这样只有所指定的路径才会被包含在转换后的仓库中。 - Kevin
2
@Kevin如果您希望项目保持其原始深层路径,那绝对是这样做的方法。我认为,由于分割是目标,因此每个项目应该被提升到新存储库的顶级位置,成为唯一的项目。 - Ry4an Brase
5
我使用了这个convert扩展程序,并一开始就想知道为什么目标路径似乎是空的。后来我意识到默认情况下在新的存储库中没有工作副本。如果你需要它,你应该在目标目录中运行hg up。也许这会帮助别人。 - vadipp

0
我在这里找到了一份详细的指南here
创建一个名为new-repo.filemap的文件映射,例如:
include vendor/FooBackend
rename vendor/FooBackend .

创建另一个文件映射rewrite-old-repo.filemap:
exclude vendor/FooBackend

创建新的代码库:
hg convert /path/to/current/repo /path/to/new/repo --filemap new-repo.filemap

新的代码库已经完成。该目录为空,但是执行hg update命令将会使其内容更新到最新状态。

创建修改后的代码库:

hg convert /path/to/current/repo /path/to/rewritten/repo --filemap rewrite-old-repo.filemap

这个工具看起来很有趣,可以将Mercurial仓库分成两个部分,但是如果我有一个包含200多个子目录的项目,并且我想将每个子目录变成自己的项目,那么似乎会变得太复杂了。 (不完全清楚我是否只需“包含”和“重命名”要保留的目录,然后排除其他200多个目录,还是需要迭代子目录中的每个文件。) - Michael

-5

只需克隆它并从每个副本中删除不需要的内容即可。


2
那并没有帮助。每次关闭仍然保留完整的历史记录,因此“太多东西”将始终存在于“.hg”目录中占用空间。 - Ry4an Brase
14
啊,你想要斯大林主义修正主义形式的版本控制。;) http://zh.wikipedia.org/wiki/%E5%8E%86%E5%8F%B2%E4%BF%AE%E6%AD%A3%E4%B9%89 - Jason S
@Ry4an 但是这些克隆不是高效的彼此副本吗?这意味着,已删除项目的修订历史记录将存在于两个存储库中,但仅在磁盘上存储一次,对吗?因此,如果我克隆了一个具有多个版本的文件A-D的存储库,然后删除了它,以给我一个A/B和C/D存储库,那么我只需要存储A-D的所有版本的一个副本,以及每个副本中的一个额外的变更集,指示C/D在其中一个中被删除,而A/B在另一个中。对吗? - Adam Wuerl
@adam 是的,只要它们都是本地克隆,存储就会很有效。原问题似乎是想要能够将子集仓库克隆到新的(非本地)位置,并使这些克隆变得更小。这只有通过修改历史记录才可能实现。 - Ry4an Brase

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接