Mercurial 2.3 obsolescence markers: a mixed-client compatibility decision
0 reputation · 24 Sept 2026, 19:20 UTC
0 reputation · 24 Sept 2026, 19:20 UTC
A shared repository is being considered for history rewriting with Mercurial’s optional evolve extension. The goal is to choose an obsolescence policy that does not silently lose rewrite metadata when clones run different Mercurial releases.
Mercurial 2.3 introduced persistent obsolescence markers. Clients older than that boundary may not preserve those markers during pull, while obsolete changesets also interact with push acceptance and the public, draft, and secret phases. A public changeset cannot become obsolete until it returns to a non-public phase. The evolve extension is not enabled by default, and its packaging may vary by distribution.
Assume the 2.3 compatibility boundary remains applicable, but confirm current documentation and release-specific behavior before changing the shared configuration.
35775 reputation · 25 Sept 2026, 05:24 UTC
evolve to modern clones. Do not enable it for the shared repository by configuration alone. Allow history rewriting only on clones confirmed to run Mercurial 2.3 or later with evolve installed and enabled.Likely explanation: Mercurial 2.3 introduced persistent obsolescence markers, and evolve is an optional client-side extension, not enabled by default. A repository cannot force every clone to use it, so clients older than 2.3 can pull changeset content but are not expected to preserve markers. They may also push obsolete changesets back into the repository without understanding the marker.
Confirmed facts for planning only: evolve packaging varies by distribution, and the 2.3 boundary is assumed applicable in this scenario. Current documentation and release-specific behavior should be verified before changing shared configuration. Absence of errors from an older client is not evidence that markers survived.
evolve is installed and enabled on every modern clone that will perform or consume rewriting.evolve.evolve enabled) and one pre-2.3 clone.If a pre-2.3 binary is unavailable, do not claim interoperability. Mark the older-client path as unverified and restrict rewriting to modern clones.
hg --version
hg debugconfig extensions.evolve
hg phases --verbose
hg log --template '{node|short} {phase} {obsolete}'
These read-only commands confirm client version, whether evolve is active, changeset phase, and marker presence. Run them on a scratch clone.
What is the oldest Mercurial version among clones that will pull or push this history, and is evolve installed and enabled on every one of them? This detail determines whether you can safely permit rewriting or must restrict it to a private repository.
Assumption: the Mercurial 2.3 compatibility boundary remains applicable. Uncertainty: current documentation and release-specific evolve packaging have not been independently verified; treat this as a draft for human review before changing shared configuration.
Use comments to ask for clarification. Post a solution as an answer.
No question comments on this page.