Alternate revno proposal (Was: Re: VCS comparison table)
bulb at ucw.cz
Wed Oct 18 22:46:23 BST 2006
On Wed, Oct 18, 2006 at 03:26:40PM +1000, Robert Collins wrote:
> revnos visibly change as your work is merged into the mainline - we've
> been doing this for years without trouble: ones own commits to a branch
> get '3', '4', '5' etc as revnos, and when they are merged to the
> mainline they used to stop having revnos at all, but now they will be
> given this dotted decimal revno. If you pull from the mainline after the
> merge, you see the new numbers, and when you look at mainline you can
> see the difference. So while I agree that the surprise the user gets is
> inversely related to the frequency with which they see the behaviour, I
> think our users see it a lot, so are not surprised much.
> FWIW, we're not optimising for mostly straight histories as I understand
> such things : our own history has 3 commits on branches to every one on
> the mainline.
Reading this thread I came to think, that the revnos should be assigned
to _all_ revisions _available_, in order of when they entered the
repository (there are some possible variations I will mention below)
- Such revnos would be purely local, but:
- Current revnos are not guaranteed to be the same in different
- They could be done so that mirror has the same revnos as the
- They would be easier to use than the dotted ones. What (at least as
far as I understand) makes revnos easier to use than revids is, that
you can remember few of them for short time while composing some
operation. Ie. look up 2 or 3 revisions in the log and than do some
command on them. And a 4 to 5-digit number like 10532 is easier to
remember than something like 3250.2.45.86.
- Their ordering would be an (arbitrary) superset of the partial
ordering by descendance, ie. if revision A is ancestor of B, it would
always have lower revno.
- The intuition that lower revno means older revision would be always
valid for related revisions and approximately valid for unrelated
- They would be *localy stable*. That is once assigned the revno would
always mean the same revision in given branch (as determined by
location, not tip).
- This is more than the current scheme can give, since now pull can
- They wouldn't make any branch special, so the objections Linus raised
does not apply.
- They would be the same as subversion and svk, and IIRC mercurial as
well, use, so:
- They would already be familiar to users comming from those systems.
- They are known to be useful that way. In fact for svk it's the only
way to refer to revisions and seem to work satisfactorily (though
note that svk is not really suitable to ad-hoc topologies).
Now I said there are two options how to assign them. These are:
- Repository-wide: Number would be assigned to each revision entering
the repository, even when it is not in ancestry of any branch (ie.
if one starts a merge, but than reverts it).
- Simpler to implement (just log every written-out revision).
- All branches in the same repository use the same revision
numbers, so if you keep branches in a shared repo, it makes
easier to look up one revision in log of one branch, other in log
of other branch and run diff on them.
- Mirror only has the same revnos if both master and the mirror are
- Branch-wide: Nuber would be assigned to each revision that becomes
ancestor of the current head revision.
- Mirror (always updated by push from the same source) always have
the same revision numbers.
- The revno assignment list could be reused for refering to state
at particular point in time (in fact, it would be exactly the
same thing as git reflog).
- Bound branches could be forced to have the same revnos.
- More complex to implement.
- More work at runtime and more space needed in a shared
repository, since each branch has it's own mapping.
Both ways, it would be implemented the way revision-history currently
is, just it would list all revisions, not just the path along the
(Should I put it on the wiki?)
- Jan Hudec `Bulb' <bulb at ucw.cz>
More information about the bazaar