如何在没有进化扩展的情况下避免对客户端的水银过时警告

How to avoid mercurial obsolete warning on clients without evolve extension

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

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

obsolete feature not enabled but 33 markers found!

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

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

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

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

[experimental]
createmarkers=True
allowunstable=True
exchangeopt=False

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

Per-repository 进化扩展

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

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

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

以及 ~/.hgrc

[extensions]
# evolve =     => Disabled on purpose

使用钩子删除过时的标记

只需使用挂钩删除存储库 hgrc 上的 .obspurge 文件:

# This is <repo>/.hg/hgrc
[alias]
obspurge = !echo "Purging obsolete markers" && rm /path/to/origin/repo/.hg/store/obsstore
[hooks]
post-push = hg obspurge