Mercurial删除历史记录

时间:2010-04-21 16:53:35

标签: mercurial

mercurial中有没有办法从数据库中删除旧的变更集?我有一个60GB的存储库,这使得克隆非常痛苦。我想在某个日期之前修剪掉所有东西,然后把巨大的数据库拿走以收集灰尘。

2 个答案:

答案 0 :(得分:47)

没有简单/推荐的方法直接对现有存储库执行此操作。

然而,您可以将您的mercurial repo“转换”为新的mercurial repo,并通过convert.hg.startrev选项从中包含历史记录选择修订版

hg convert --config convert.hg.startrev=1234 <source-repository> <new-repository-name>

新的仓库将包含原始仓库中的所有内容减去起始修订版之前的历史记录。

警告:新的仓库将拥有全新的变更集ID,即它与原始仓库无关。创建新的repo后,每个开发人员都必须克隆新的repo并从原始repo中删除它们的克隆。

我用它来清理我们公司内部使用的旧存储库 - 结合--filemap选项来删除不需要的文件。

答案 1 :(得分:27)

你可以这样做,但这样做会使所有克隆无效,所以除非你完全独自工作,否则一般都不明智。

mercurial中的每个变更集都由哈希码唯一标识,哈希码是(除其他外)源代码更改,元数据和其一个或两个父项的哈希的组合。那些父母需要一直存在于回购中,直到项目的开始。 (没有那个限制就是有浅克隆,但还没有)。

如果您可以更改新更改集的哈希值(这会再次破坏野外的所有克隆),您可以使用命令执行此操作;

hg export -o 'changeset-%r.patch' 400:tip   # changesets 400 through the end for example
cd /elsewhere
hg init newrepo
cd newrepo
hg import /path/to/the/patches/*.patch

你可能需要做一些工作来处理合并变更集,但这是一般的想法。

也可以使用类型为hg convert的{​​{1}}作为源类型和目标类型,并使用hg,但这可能更复杂。

更大的问题是,如何输入60GB的源代码,或者是否根据所有建议添加生成的文件。 :)