使用 Mercurial,我如何捆绑所有不知道在另一个存储库中的变更集,包括秘密变更集?
我知道bundle
's--base
选项恰好包含秘密变更集,但我不想要这种--base
行为。(而且总是包含秘密变更集,--base
但如果没有它就永远不会包含它,这似乎异常奇怪。不应该有一个单独的选项吗?)
仅供参考,我通常希望在尝试重写潜在危险的历史记录之前备份仅在我的本地存储库中的所有变更集。
使用 Mercurial,我如何捆绑所有不知道在另一个存储库中的变更集,包括秘密变更集?
我知道bundle
's--base
选项恰好包含秘密变更集,但我不想要这种--base
行为。(而且总是包含秘密变更集,--base
但如果没有它就永远不会包含它,这似乎异常奇怪。不应该有一个单独的选项吗?)
仅供参考,我通常希望在尝试重写潜在危险的历史记录之前备份仅在我的本地存储库中的所有变更集。
您是正确的,hg bundle
通常会排除秘密变更集。这是因为它只是运行hg outgoing
和捆绑这些变更集的等价物。
所以一些解决方法:
如果您知道您至少有一个草稿或公共传出变更集作为您的秘密变更集的祖先,那么您可以使用
$ hg bundle --base "parents(outgoing())"
得到你想要的。修订集将outgoing()
挑选缺失的草案和公共变更集,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
- 传递错误的参数不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
Martin 的答案的问题在于它依赖于传出,而传出又依赖于与推送存储库的直接连接。如果您并不总是与该存储库建立互联网连接,那么这些方法对我来说效果很好。它也比相位舞更简单。
是否有任何公共变更集的一项测试是捕获以下输出:
hg log -r public() -l 1 --template "{rev}"
并测试它的长度,或 [0-9] 的存在。