Mercurial:向公众展示一部分历史

时间:2013-07-10 17:23:06

标签: mercurial

我想将现有私有存储库的子集发布到公众中。鉴于两个存储库privatepublic,我想执行以下操作:

  • private包含项目的整个历史记录,包括机密信息。
  • public应包含private历史记录的子集,减去机密信息。

我可以在private中生成一个新分支,它接受最新的变更集并删除所有机密信息,但我不想与public分享此分支的祖先。

问题:如何在保持存储库相关的同时从public中删除历史记录?这意味着,我需要能够hg pullpublic进入private

更新

  1. 这个问题与https://stackoverflow.com/a/5516141/14731的不同之处在于我需要隐藏public的现有祖先(而不是隐藏新头)。
  2. https://stackoverflow.com/a/4034084/14731可能会有效,但我想知道是否有一种更好的方法,而不是与一个不相交的头合并。

2 个答案:

答案 0 :(得分:2)

经过进一步的反思,我认为https://stackoverflow.com/a/4034084/14731产生一个不相交的头部是有道理的,因为远程变换集实际上代表了一个没有祖先的头。从好的方面来看,这种方法具有最小的磁盘空间成本。磁盘上没有重复文件。您最终只需支付一些费用(我的结果是85k)来获取额外的元数据。

以下是如何实施此方法:

  1. hg archiveprivate的清理分支中提取最新的变更集。
  2. hg init从此变更集创建新存储库。
  3. hg pull [private] --forcepublic(一个不相关的存储库)作为新的不相交分支拉入private
  4. 此时你有两个选择:将不相交的头部合并到private的消毒分支中。

    选项1:合并头

    • 优点
      • private存储库可以看到privatepublic之间的历史链接。
    • 缺点
      • 您无法将更改从private推送到public,因为这样做会推动您努力排除的祖先。为什么? hg push无法exclude ancestors of a merge
      • 您需要直接与private互动才能修改已清理的分支。
      • privatepublic贡献补丁变得更加困难(因为您无法直接使用历史元数据)。

    选项2:未合并头

    • 优点
      • 能够将更改从private推送到public,而不会泄露私有变更集。您可以使用hg push -b disjointBranch
      • 执行此操作
    • 缺点
      • 你在{private。
      • 中失去了public与其祖先之间的历史联系

    我仍在寻找更优雅的解决方案。如果您有更好的答案,请发布。

答案 1 :(得分:1)

如果你的真实任务真的是“隐藏私人数据”,而不是“仅显示历史的一小部分”(见差异),你可以

  • 激活并使用MQ Extension
  • 将所有更改非公开数据的更改集转换为mq-patches
  • 从补丁中删除所有与私有数据处理无关的编辑
  • 使用某些关键字
  • 替换所有出现的私人数据代码
  • 编辑队列中的相关补丁(现在必须用值替换关键字)
  • 将“抛光”的私人回购推送给公众(之前未应用所有mq-patches)

为了在将来“安全推送”中添加别名到私人仓库(当使用时,只推送没有/如果有/应用补丁的变更集),smth。等。

[alias]
spush = hg qpop -a && hg push

或者,以更现代的方式,对于支持阶段的Mercurial,总是在秘密阶段(即不可发布)具有mq-patches并且不担心在推送之前应用|未应用状态

[mq]
secret = True

私人回购的.hgrc