On Fri, Aug 11, 2017 at 12:46 AM, Thorsten Glaser <t...@mirbsd.de> wrote:
> Package: cvs2svn
> Version: 2.4.0-4
> Severity: important
>
> I regularily convert some CVS repositories of mine to push-only
> git mirrors. Today I noticed a problem for the second time: a
> push was rejected because it needs a force.
>
> [...]
>
> The remote mirror then rejected it. I did commit the jupprc file
> in several branches simultaneously, but, of course, the “second”
> part of the timestamp differs (this happens when your CVS server
> is a Pentium 233 MMX ☺).

Tl;dr: The reporter's use of cvs2git for "incremental conversions" is
not supported, though it probably works most of the time. cvs2git is
meant for one-time conversions and does not promise that the
overlapping parts of the history resulting from two conversions are
consistent. In this case the results are inconsistent, so Git rejects
a non-force push of the second set of results.

Longer explanation: CVS does not keep an unambiguous record of what
file changes were committed at the same time, nor of when a tag or
branch was created (also note that CVS allows different files to be
added to a branch or tag at different times). Moreover, CVS timestamps
are not entirely trustworthy and not necessarily consistent when
multiple files are modified in a single CVS commit. So cvs2git uses a
bunch of heuristics to decide which file-wise CVS revisions to group
together into a Git commit. The decisions made for one "commit" can be
influenced by "later" CVS activity. (I put the terms "commit" and
"later" in quotation marks because those are not CVS concepts; they
have to be inferred by cvs2git based on the snapshot of the CVS
history that it has available.)

While cvs2git attempts to provide deterministic output given the same
inputs, and tries to avoid gratuitous differences across runs for
similar inputs, it does *not* guarantee that the overlapping part of
history for two conversions are the same if there has been CVS
activity between the conversions. Adding the latter guarantee would be
a lot of work and would require one run of cvs2git to have access to
the results of the previous run.

Michael

Reply via email to