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

时间:2012-03-09 16:58:05

标签: mercurial bundle dvcs mercurial-phases

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

我知道bundle的{​​{1}}选项恰好包含了秘密更改集,但我不想要--base行为。 (并且--base中包含总是的秘密更改集似乎异常奇怪,但如果没有它,永远不会包含。不应该有单独的选项吗?)< / p>

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

2 个答案:

答案 0 :(得分:5)

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

所以一些解决办法:

  • 如果您知道自己至少有一个草稿或公开传出变更集作为您的秘密变更集的祖先,那么您可以使用

    $ hg bundle --base "parents(outgoing())"
    

    得到你想要的东西。 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
    

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

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

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

    hg bundle

    在调用别名之前,Mercurial会扩展[alias] bundle-all = !secret=$(hg log --template "{rev} " -r "secret()"); hg phase -d $secret; hg bundle $@; hg phase -f -s $secret ,这样可以为$@插入必要的参数。

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

答案 1 :(得分:1)

如果您知道至少有一个公共变更集,则可以使用:

hg bundle -r "not public()" --base public()

OTOH,如果没有公共变更集,那就不会工作,请改用:

hg bundle -r "not public()" --base null

马丁回答的问题在于它依赖于传出,后者又依赖于与推送回购的直接连接。如果你不总是有一个互联网连接到这个回购,这些方法对我来说很好。它也比阶段舞更简单。

是否有任何公共变更集的一个测试是捕获输出:

hg log -r public() -l 1 --template "{rev}"

并测试其长度,或[0-9]的存在。