【问题标题】:Mercurial Remove HistoryMercurial 删除历史记录
【发布时间】:2011-02-10 17:03:08
【问题描述】:

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

【问题讨论】:

  • 它是如何开始变得如此庞大的?
  • 如果 Jake 有任何二进制文件(有时是必需的......并非所有二进制文件都是由源生成的),那么对该文件的每一个小的更改都会在 repo 中生成一个新副本。根据文件的大小或更改的频率,60GB 之类的东西可能不会花这么长时间。

标签: mercurial


【解决方案1】:

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

但是,您可以将您的 mercurial 存储库“转换”为新的 mercurial 存储库,并通过 convert.hg.startrev 选项从其中选择一个修订版以包含以后的历史记录

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

新的 repo 将包含从原始 repo 减去开始修订之前的历史记录的所有内容。

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

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

【讨论】:

  • 那么该解决方案与仅删除 .hg/ 子目录并执行 hg init 有何不同?
  • 对不起,我不明白你的评论。本地 .hg 目录和 hg init 与从存储库中删除变更集有什么关系?
  • @Gaks,您的方法会破坏整个存储库并创建一个新存储库,Gerd 的方法有选择地从某个修订版本中销毁存储库。根据您的情况,这两种方法都很有用。 Gerd 的方法现在对我很有用,因为我即将公开一个私有存储库并希望保留上个月的修订,但在此之前没有任何内容。
  • @Gaks 您的方法也只会保留当前分支,因为 Gerds 方法将保留它们。
  • 这需要启用convert 扩展:[extensions] hgext.convert=
【解决方案2】:

您可以这样做,但这样做会使所有克隆都无效,因此除非您完全独自工作,否则这样做通常是不明智的。

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 converthg 作为源类型和目标类型,并使用splicemap,但这可能还涉及更多。

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

【讨论】:

  • 比我的(已删除)答案更详细的回复。 +1
  • 我正在从另一个源代码控制系统导入一个包含生成的二进制文件的项目。我们现在正试图让 dll 脱离源代码控制。感谢您的帮助!
  • 答案包含错字。文件名应包含小写的 %r(零填充数字),否则在导入文件时将不会以正确的顺序处理文件。
  • 我发现首先使用 hg qimport 将补丁导入 mercurial 队列,然后使用 qpush 逐个推送,修复最终问题,最后使用 hg qfinish -a 提交所有内容,这很有帮助
  • 根据我的经验,hg converthg export 保留更多信息(无需合并变更集)。 Gerd 的答案比使用splicemap 更容易,并且可能比export 更可靠:stackoverflow.com/a/8819813/14731
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多