Mercurial删除历史记录

Jak*_*son 52 mercurial

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

Ger*_*ima 48

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

但是,您可以将您的mercurial仓库"转换"为新的mercurial仓库,并通过convert.hg.startrev选项从中包含历史记录的位置选择修订版本

hg convert --config convert.hg.startrev=1234 <source-repository> <new-repository-name>
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • @Gaks,你的方法破坏了整个存储库并创建了一个新的存储库,Gerd的方法有选择地从某个修订版本中销毁存储库.根据您的具体情况,这两种方法都很有用 Gerd的方法现在对我很有用,因为我要公开一个私有存储库,并希望保留上个月的修订版,但之前没有任何内容. (6认同)
  • 这需要启用`convert`扩展名:[extensions] hgext.convert = (3认同)

Ry4*_*ase 28

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

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
Run Code Online (Sandbox Code Playgroud)

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

也可以使用hg convert类型hg作为源类型和目标类型,并使用a splicemap,但这可能更多涉及.

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

  • 答案包含一个拼写错误.文件名应包含小写%r(零填充数字),否则在导入文件时将无法按正确的顺序处理文件. (3认同)