水银:在捆绑包中包含秘密变更集?
-
10-12-2019 - |
题
使用 Mercurial,我如何捆绑所有未知的变更集在另一个存储库中, 包括 秘密变更集?
我知道 bundle
的 --base
选项恰好包含秘密变更集,但我不希望 --base
行为。(秘密变更集似乎异常奇怪 总是 包含在 --base
但是 绝不 包括没有它。难道不应该有一个单独的选项吗?)
仅供参考,在尝试重写潜在危险的历史记录之前,我通常希望备份仅在本地存储库中的所有变更集。
解决方案
你是对的 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
call — 传递错误的参数hg bundle
不应该意味着您丢失有关秘密变更集的所有信息。另请注意,由于秘密变更集仅具有秘密后代,因此此技术不会丢失信息。您可以将其变成 shell 别名:
[alias] bundle-all = !secret=$(hg log --template "{rev} " -r "secret()"); hg phase -d $secret; hg bundle $@; hg phase -f -s $secret
这
$@
在调用别名之前由 Mercurial 扩展,这使您可以插入必要的参数hg bundle
.
请注意,相位信息不能存储在捆绑包中 - 捆绑包格式尚未更改以适应它。
其他提示
如果您知道至少有一个公共变更集,则可以使用以下命令:
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]的存在。