First, please keep in mind that in principle, Mercurial is backwards compatible with older versions and older repository layouts. In general, Mercurial tries very hard not to break a repository layout, and if you want to take advantage of newer features, you can do hg clone --uncompressed, otherwise your Mercurial should limit itself to features of the repository format from when the repository was created.

Unfortunately, occasionally an experimental feature may not be sufficiently forward looking. Obsolete markers was one such experiment. To work around this, you have a couple of options:

  1. Upgrade all Mercurial binaries to use a version greater than (??) which doesn't have this bug.
  2. Have two repositories, one which is only used by the old mercurial and for which all operations to the other are done via bundles (instead of letting the newer mercurial make the old repository incompatible w/ the older mercurial).
  3. Periodically delete the obsstore from the old repositories to "fix" the error.

To understand this problem technically, you can look at Mercurial as of 974389427e5flocalrepo.obstore first tries to establish obsolete.obsstore() then it checks obsolete._enabled

Unfortunately, obsolete.obstore.__init__ calls _readmarkers, and that calls Abort()

So, if you use an old version of hg w/ a repo that isn't officially incompatible w/ that version of hg, then it may be locked out anyway.