1

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

2 回答 2

2

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

以下是如何实现这种方法:

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

此时您有两个选择:将不相交的头部合并到private's sanitized 分支中,或者不合并。

选项1:合并头部

  • 好处
    • 存储库可以看到和private之间的历史链接。privatepublic
  • 缺点
    • 您不能将更改从privateto推送,public因为这样做会推动您努力排除的祖先。为什么?hg push不能排除合并的祖先
    • 您需要直接交互private才能修改已清理的分支。
    • 贡献补丁 from privatetopublic变得更加困难(因为您不能直接使用历史元数据)。

选项 2:未合并的头部

  • 好处
    • 能够在不泄露私有变更集的情况下将变更推private送到一起。public您可以使用hg push -b disjointBranch.
  • 缺点
    • public您在“私人”中失去了与其祖先之间的历史联系。

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

于 2013-07-10T18:01:26.177 回答
1

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

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

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

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

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

[mq]
secret = True

在私人回购的 .hgrc

于 2013-07-11T07:17:24.977 回答