如何在没有进化扩展的情况下避免对客户端的水银过时警告
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
我目前在一家使用 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