Mercurial删除历史记录

Mercurial删除历史记录,mercurial,Mercurial,mercurial中有没有从数据库中删除旧变更集的方法?我有一个60GB的存储库,这使得克隆非常痛苦。我想在某个日期之前删除所有内容,并将庞大的数据库放在一边收集灰尘。你可以这样做,但这样做会使所有克隆无效,因此通常不明智,除非你完全独自工作 mercurial中的每个变更集都由hashcode唯一标识,hashcode是源代码变更、元数据及其一个或两个父项的哈希的组合。这些父母需要一直存在于回购协议中,直到项目开始。(没有这个限制就意味着拥有浅层克隆,而浅层克隆目前还不可用) 如果您可以更改较

mercurial中有没有从数据库中删除旧变更集的方法?我有一个60GB的存储库,这使得克隆非常痛苦。我想在某个日期之前删除所有内容,并将庞大的数据库放在一边收集灰尘。

你可以这样做,但这样做会使所有克隆无效,因此通常不明智,除非你完全独自工作

mercurial中的每个变更集都由hashcode唯一标识,hashcode是源代码变更、元数据及其一个或两个父项的哈希的组合。这些父母需要一直存在于回购协议中,直到项目开始。(没有这个限制就意味着拥有浅层克隆,而浅层克隆目前还不可用)

如果您可以更改较新变更集的哈希值(这再次破坏了所有的克隆),那么您可以使用命令进行更改

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
您可能需要做一些工作来处理合并变更集,但这只是一般的想法

我们也可以使用
hgconvert
和类型
hg
作为源类型和目标类型,并使用
拼接图来实现,但这可能更复杂


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

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

但是,您可以将您的mercurial回购“转换”为新的mercurial回购,并通过convert.hg.startrev选项选择从何处开始包括历史记录的修订

hg convert --config convert.hg.startrev=1234 <source-repository> <new-repository-name>
hg convert--config convert.hg.startrev=1234
新回购协议将包含从原始回购协议减去之前历史记录到开始修订的所有内容

警告:新回购协议将具有全新的变更集ID,即它与原始回购协议无关。创建新的回购协议后,每个开发人员都必须克隆新的回购协议,并从原始回购协议中删除其克隆


我用它来清理公司内部使用的旧回购协议,并结合--filemap选项来删除不需要的文件。

比我(已删除)的回答更详细+1我正在从另一个源代码管理系统导入一个包含生成的二进制文件的项目。我们正在努力使DLL脱离源代码管理。谢谢你的帮助!答案有错。文件名应包含小写的%r(零填充数字),否则在导入文件时无法按正确的顺序处理这些文件。我发现先使用
hg qimport
将修补程序导入mercurial队列,然后使用
qpush
逐个推送非常有用,根据我的经验,
hg convert
hg export
保留了更多的信息,用
hg qfinish-a解决了最终的问题并最终提交了所有内容(无需合并变更集)。Gerd的答案比使用
拼接图
更简单,而且可能比
导出
更可靠:它是如何开始变得如此庞大的?如果Jake有任何二进制文件(有时是必要的……并非所有二进制文件都是由源代码生成的),那么对该文件的每一个小更改都会导致在repo中生成一个新的副本。根据文件的大小或更改的频率,60GB之类的东西可能不会花这么长时间。那么,这种解决方案与删除.hg/子目录并执行hg init有什么不同呢?对不起,我不理解您的评论。local.hg dir和hg init与从存储库中删除变更集有什么关系?@Gaks,您的方法会销毁整个存储库并创建一个新的存储库,Gerd的方法会有选择地从某个版本中销毁存储库。根据您的情况,这两种方法都很有用。Gerd的方法现在对我很有用,因为我即将公开一个私有存储库,并希望保留上个月的修订版,但不是之前的任何修订版。@Gaks您的方法也将只保留当前分支,因为Gerds方法将保留它们。这需要启用
转换
扩展:[扩展]hgext.convert=