【问题标题】:Mercurial: exposing a subset of history to the publicMercurial:向公众公开历史的一个子集
【发布时间】:2013-07-08 18:14:26
【问题描述】:

我想向公众发布现有私有存储库的子集。给定两个存储库,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 可能有效,但我想知道是否有比合并不相交的头部更好的方法。

【问题讨论】:

    标签: mercurial


    【解决方案1】:

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

    • 激活和使用 MQ 扩展
    • 将所有更改非公开数据的变更集转换为 mq 补丁
    • 从补丁中删除所有与私有数据处理无关的编辑
    • 用一些关键字替换代码中所有出现的私有数据
    • 编辑队列中的相关补丁(现在必须用值替换关键字)
    • 将“抛光的”私有存储库推送到公共(之前未应用所有 mq 补丁)

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

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

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

    [mq]
    secret = True
    

    在私人仓库的 .hgrc 中

    【讨论】:

      【解决方案2】:

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

      这里是如何实现这种方法:

      1. hg archiveprivate 的已清理分支中提取最新的变更集。
      2. hg init 从这个变更集中创建一个新的存储库。
      3. hg pull [private] --forcepublic(一个不相关的存储库)拉入 private 作为一个新的不相交分支。

      此时您有两个选择:是否将不相交的头部合并到private 的已清理分支中。

      选项 1:合并头部

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

      选项 2:未合并的头部

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

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

      【讨论】:

        猜你喜欢
        • 2020-11-23
        相关资源
        最近更新 更多