Subject: Re: 2.29.0.rc0.windows.1: Duplicate commit id error message when fetching

From: Taylor Blau <[email-masked]>
Date: Fri, 9 Oct 2020 14:28:33 -0400

On Fri, Oct 09, 2020 at 01:55:06PM -0400, Jeff King wrote:
> On Fri, Oct 09, 2020 at 01:46:07PM -0400, Derrick Stolee wrote:
>
> > > Can you reproduce it if you do
> > >
> > > git config core.commitGraph false
> > > git config fetch.writeCommitGraph true
> > > ?
> >
> > I _can_ repro it in this case! I think there must be something
> > very interesting going on where the commit-graph is parsed in
> > _some_ places, but not in others. This is something that I can
> > really start to dig into.
>
> Here's a much more minimal reproduction:
>
>   git init repo
>   cd repo
>
>   git commit --allow-empty -m one
>   git rev-parse HEAD |
>   git -c core.commitGraph=false \
>       commit-graph write --split=no-merge --stdin-commits
>   git rev-parse HEAD |
>   git -c core.commitGraph=false \
>       commit-graph write --split=no-merge --stdin-commits
>
>   git commit --allow-empty -m two
>   git rev-parse HEAD |
>   git commit-graph write --split --stdin-commits
>
> The final write will die() with the "unexpected duplicate" message.

Makes sense; the second commit-graph write won't know that 'one' is
already in the graph because 'core.commitGraph' prevents
'prepare_commit_graph()' from actually loading the graph (actually
loading the graph would be enough to stop the second write from
occurring at all.)

I'm of two minds about what we could be doing here:

  - On the one hand we could be ignoring `core.commitGraph` setting
    during commit-graph writes and forcibly loading the commit-graph
    anyway.

  - But on the other hand, writing a commit graph with `core.commitGraph` set
    to false makes no sense. So, I'd almost rather have us die()
    immediately if core.commitGraph is set to false.

I think I'd advocate for the latter, along with Stolee's patch to not
die in the case of duplicate commits in multiple layers of the graph.

> -Peff

Thanks,
Taylor