Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mercurial:向公众公开历史的一部分_Mercurial - Fatal编程技术网

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
    提供补丁变得更加困难(因为您无法直接使用历史元数据)
  • 选项2:未合并的头部
    • 优势
      • 能够将更改从
        private
        推送到
        public
        ,而不显示私有更改集。您可以使用
        hg push-b disjointBranch
        执行此操作
    • 缺点
      • 您将失去
        public
        与其“private”中的祖先之间的历史链接

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

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

    • 激活并使用MQ扩展
    • 将所有更改非公共数据的更改集转换为mq修补程序
    • 从修补程序中删除与私有数据处理无关的所有编辑
    • 在代码中用某些关键字替换所有出现的私有数据
    • 编辑队列中的相关修补程序(现在必须用值替换关键字)
    • 将“完善的”私有回购推至公共(以前未应用所有mq修补程序)
    为了将来“安全推送”将别名添加到私有回购(使用时,仅推送不带/如果有/应用补丁的变更集),smth。喜欢

    [alias]
    spush = hg qpop -a && hg push
    
    或者,以更现代的方式,对于支持阶段的Mercurial,总是在秘密阶段有mq补丁(即不可发布),并且不必担心推送之前的应用|未应用状态

    [mq]
    secret = True
    
    在私人回购中。hgrc