我想将现有私有存储库的子集发布到公众中。鉴于两个存储库private
和public
,我想执行以下操作:
private
包含项目的整个历史记录,包括机密信息。public
应包含private
历史记录的子集,减去机密信息。我可以在private
中生成一个新分支,它接受最新的变更集并删除所有机密信息,但我不想与public
分享此分支的祖先。
问题:如何在保持存储库相关的同时从public
中删除历史记录?这意味着,我需要能够hg pull
从public
进入private
。
更新:
public
的现有祖先(而不是隐藏新头)。答案 0 :(得分:2)
经过进一步的反思,我认为https://stackoverflow.com/a/4034084/14731产生一个不相交的头部是有道理的,因为远程变换集实际上代表了一个没有祖先的头。从好的方面来看,这种方法具有最小的磁盘空间成本。磁盘上没有重复文件。您最终只需支付一些费用(我的结果是85k)来获取额外的元数据。
以下是如何实施此方法:
hg archive
从private
的清理分支中提取最新的变更集。hg init
从此变更集创建新存储库。hg pull [private] --force
将public
(一个不相关的存储库)作为新的不相交分支拉入private
。此时你有两个选择:将不相交的头部合并到private
的消毒分支中。
private
存储库可以看到private
和public
之间的历史链接。private
推送到public
,因为这样做会推动您努力排除的祖先。为什么? hg push
无法exclude ancestors of a merge。private
互动才能修改已清理的分支。private
到public
贡献补丁变得更加困难(因为您无法直接使用历史元数据)。private
推送到public
,而不会泄露私有变更集。您可以使用hg push -b disjointBranch
。public
与其祖先之间的历史联系
我仍在寻找更优雅的解决方案。如果您有更好的答案,请发布。
答案 1 :(得分:1)
如果你的真实任务真的是“隐藏私人数据”,而不是“仅显示历史的一小部分”(见差异),你可以
为了在将来“安全推送”中添加别名到私人仓库(当使用时,只推送没有/如果有/应用补丁的变更集),smth。等。
[alias]
spush = hg qpop -a && hg push
或者,以更现代的方式,对于支持阶段的Mercurial,总是在秘密阶段(即不可发布)具有mq-patches并且不担心在推送之前应用|未应用状态
[mq]
secret = True
私人回购的.hgrc