5

我目前在一家使用 mercurial 的公司工作,但大多数开发人员使用 MQ 而不是新的进化流程。因此,大多数用户没有启用扩展。

每次我推送到主存储库时,.hg/store/obsstore都会自动推送过时的变更集。这是有问题的,因为之后所有未启用扩展的用户都会收到以下消息:

未启用过时的功能,但找到了 33 个标记!

答案中提出的一种解决方案涉及在本地删除.obsstore,但这不是我想要的,因为我仍在使用evolve,这意味着我希望过时的变更集保持隐藏状态。不仅如此,服务器 repo 上还应该提供过时的标记和变更集,以便我们保持使用evolve智能冲突解决等的好处。

我希望有一种方法可以不将过时的变更集推送到服务器存储库,或者(正确的方法)让服务器在未evolve启用的情况下不将过时的数据推送到客户端。

这可能吗?如果不是,为什么不呢?

4

2 回答 2

2

我发现了一些解决这个问题的方法(hacks),因为在撰写这个答案时,mercurial 似乎无法解决这个问题:

每个存储库演变扩展

从文件中删除evolve扩展名,~/.hgrc在每个存储库的基础上启用它,然后使用 SSH 指向存储库(在我们的例子中,它位于 NFS 上,这是问题的根源)。

也就是说,在您的存储库中,hgrc您将拥有:

# This is <repo>/.hg/hgrc
[paths]
default = ssh://localhost//path/to/origin/repo
[extensions]
evolve =

和上~/.hgrc

[extensions]
# evolve =     => Disabled on purpose

使用钩子删除过时的标记

只需使用钩子删除.obspurge存储库中的文件hgrc

# This is <repo>/.hg/hgrc
[alias]
obspurge = !echo "Purging obsolete markers" && rm /path/to/origin/repo/.hg/store/obsstore
[hooks]
post-push = hg obspurge
于 2019-05-08T16:54:43.230 回答
2

如果你真的想在本地使用进化而不是交换你的标记,你可以做到。我会告诉你怎么做,但要注意,你会遇到与使用剥离和变基而不进化的完全相同的问题。如果您推送变更集的先前版本并推送新版本,则服务器将同时拥有这两个版本。如果您只想在本地使用 Evolve,您可以在配置文件中添加以下行:

[experimental]
createmarkers=True
allowunstable=True
exchangeopt=False
于 2018-06-12T07:33:33.030 回答