Mercurial:向公众公开历史的一部分
我想将现有私有存储库的一个子集发布到公共存储库中。给定两个存储库,Mercurial:向公众公开历史的一部分,mercurial,Mercurial,我想将现有私有存储库的一个子集发布到公共存储库中。给定两个存储库,private和public,我想执行以下操作: private包含项目的全部历史记录,包括机密信息 public应包含private历史的子集,减去机密信息 我可以在private中生成一个新分支,该分支接受最新的变更集并删除所有机密信息,但我不想与public共享此分支的祖先 问题:如何在保持存储库相关的同时,从public中删除历史记录?也就是说,我需要能够将hg从public拉入private 更新: 这个问题的不同之
private
和public
,我想执行以下操作:
包含项目的全部历史记录,包括机密信息private
应包含public
历史的子集,减去机密信息private
private
中生成一个新分支,该分支接受最新的变更集并删除所有机密信息,但我不想与public
共享此分支的祖先
问题:如何在保持存储库相关的同时,从public
中删除历史记录?也就是说,我需要能够将hg从public
拉入private
更新:
这个问题的不同之处在于,我需要向公众隐藏现有的祖先(而不是隐藏新的头)
可能有用,但我想知道是否有比合并一个不相交的头更好的方法
经过进一步思考,我认为产生一个不相交的头部是有意义的,因为远程变更集确实代表了一个没有祖先的头部。从好处看,这种方法的磁盘空间成本最低。这些文件在磁盘上不重复。你只需要为额外的元数据付一点钱(我这边是85k)
以下是如何实施此方法:
hg archive
从private
的净化分支提取最新变更集
hg init
从该变更集创建新的存储库
hg pull[private]——强制将public
(不相关的存储库)作为一个新的不相交分支拉入private
此时您有两个选项:将不相交的头合并到private
的消毒分支,或者不合并
选项1:合并头
- 优势
private
存储库可以看到private
和public
之间的历史链接
- 缺点
- 您不能将更改从
private
推送到public
,因为这样做会推送到您努力排除的祖先。为什么?<代码>hg推送
无法执行
private
交互,以便修改经过消毒的分支private
到public
提供补丁变得更加困难(因为您无法直接使用历史元数据)- 优势
- 能够将更改从
推送到private
,而不显示私有更改集。您可以使用public
执行此操作hg push-b disjointBranch
- 能够将更改从
- 缺点
- 您将失去
与其“private”中的祖先之间的历史链接public
- 您将失去
我仍在寻找更优雅的解决方案。如果你有更好的答案,请发布。如果你真正的任务是“隐藏私人数据”,而不是“只显示历史的一小部分”(见区别),你可以
- 激活并使用MQ扩展
- 将所有更改非公共数据的更改集转换为mq修补程序
- 从修补程序中删除与私有数据处理无关的所有编辑
- 在代码中用某些关键字替换所有出现的私有数据
- 编辑队列中的相关修补程序(现在必须用值替换关键字)
- 将“完善的”私有回购推至公共(以前未应用所有mq修补程序)
[alias]
spush = hg qpop -a && hg push
或者,以更现代的方式,对于支持阶段的Mercurial,总是在秘密阶段有mq补丁(即不可发布),并且不必担心推送之前的应用|未应用状态
[mq]
secret = True
在私人回购中。hgrc