Mercurial:在包中包含秘密变更集?

Jon*_*ric 6 mercurial bundle dvcs mercurial-phases

使用Mercurial,我如何捆绑所有未知的更改集,包括秘密更改集?

我知道bundle--base选项恰好包括秘密的变更,但我不希望--base行为.(而且秘密变更集总是包含--base但似乎非常奇怪,但是如果没有秘密变更集,它就不会包含在内.不应该有单独的选项吗?)

仅供参考,我通常希望在尝试潜在危险的历史记录重写之前备份仅在我的本地仓库中的所有变更集.

Mar*_*ler 5

你是正确的,hg bundle通常会排除秘密变更集.这是因为它只是运行相当于hg outgoing并捆绑这些变更集.

所以一些解决方法:

  • 如果您知道至少有一个草稿或公共外发变更集作为您的秘密更改集的祖先,那么您可以使用

    $ hg bundle --base "parents(outgoing())"
    
    Run Code Online (Sandbox Code Playgroud)

    得到你想要的.该outgoing()revset会挑缺少的草案和公众的变更和parents(outgoing()将是合适的基地.既然你使用--base了这些基础的所有后代(公共,草案和秘密).

  • 您可以暂时使您的秘密更改集草稿,捆绑,然后再次将其标记为秘密:

    $ secret=$(hg log --template "{rev} " -r "secret()"); \
      hg phase -d $secret; \
      hg bundle out.hg; \
      hg phase -f -s $secret
    
    Run Code Online (Sandbox Code Playgroud)

    (我使用Zsh而不得不使用,${=secret}而不是$secret因为默认情况下Zsh不对参数扩展进行分词.)

    将命令链接起来很重要,;而不是&&因为无论hg bundle调用中发生了什么,你都想重置阶段- 传递错误的参数hg bundle并不意味着你丢失了有关秘密变更集的所有信息.另请注意,由于秘密更改集只有秘密后代,因此使用此技术不会丢失信息.

    您可以将其转换为shell别名:

    [alias]
    bundle-all = !secret=$(hg log --template "{rev} " -r "secret()");
                 hg phase -d $secret;
                 hg bundle $@;
                 hg phase -f -s $secret
    
    Run Code Online (Sandbox Code Playgroud)

    $@由水银扩展调用别名前,这可以让你插入必要的论据hg bundle.

请注意,阶段信息不能存储在捆绑包中 - 捆绑包格式尚未更改以适应它.