Git development
 help / color / mirror / Atom feed
From: Jeff King <peff@peff.net>
To: Junio C Hamano <gitster@pobox.com>
Cc: Taylor Blau <me@ttaylorr.com>,
	git@vger.kernel.org,
	Johannes Schindelin <Johannes.Schindelin@gmx.de>
Subject: Re: MIDX woes, was Re: [ANNOUNCE] Git v2.54.0-rc2
Date: Thu, 16 Apr 2026 01:17:32 -0400	[thread overview]
Message-ID: <20260416051732.GA48541@coredump.intra.peff.net> (raw)
In-Reply-To: <xmqq5x5s540j.fsf@gitster.g>

On Wed, Apr 15, 2026 at 02:04:44PM -0700, Junio C Hamano wrote:

> Johannes Schindelin <Johannes.Schindelin@gmx.de> writes:
> 
> >>  * Further work on incremental repacking using MIDX/bitmap
> >
> > I just noticed that a fetch with v2.54.0-rc2 into an existing repository
> > rendered it unusable for Git v2.53.0:
> >
> >   fatal: multi-pack-index version 2 not recognized
> >
> > Is it possible that v2.54.0-rc2 forcefully uses a MIDX version that has
> > _just_ been introduced?
> >
> > If so, that might have been a premature bump of the default MIDX version,
> > if even the preceding Git version fails to handle that MIDX version. It is
> > guaranteed to cause substantial problems in setups where e.g. libgit2 or
> > JGit is expected to be used interchangeably with Git. It also causes
> > problems when users have to downgrade Git, or use several Git versions
> > side by side (e.g. using GitHub Desktop, which bundles its own version of
> > Git).
> 
> Is b2ec8e90 (midx: do not require packs to be sorted in
> lexicographic order, 2026-02-24), which says
> 
>     This change produces MIDXs which may not be correctly read with external
>     tools or older versions of Git. Though older versions of Git know how to
>     gracefully degrade and ignore any MIDX(s) they consider corrupt,
>     external tools may not be as robust. To avoid unintentionally breaking
>     any such tools, guard this change behind a version bump in the MIDX's
>     on-disk format.
>     
> relevant?  The version bump seems to be doing more harm to "older
> versions of Git" that "know how to gracefully degrade" by not
> allowing them to degrade.

Eek. The midx _should_ be an optional component, so returning an error
during load would then just look in the regular pack .idx files. But
there are a few die() calls in the loading function. :(

Something like the patch below on top of v2.53.0 gets the desired effect
(we print "version 2 not recognized to stderr" and then everything works
anyway). But of course we can't go back in time now to fix it (and
earlier versions).

I wonder how libgit2 and JGit handle this:

  - Looking in the source, JGit will throw an exception, which is
    presumably caught and handled OK (at least seems to using the "jgit"
    CLI I have handy). So that's good.

  - libgit2 seems to "return midx_error()" if the signature or version
    isn't matched. I don't have an easy tool built against it, but
    looking at the code I think it would quietly fall back to using the
    actual packs.

So it really is just our old versions that are the problem.

I think removing the .midx file (and optionally regenerating with the
old version) would be the appropriate workaround, but I wonder how hard
it would be to go back to generating v1 midx files by default. I know v2
is a building block for more advanced features, but for those who are
not using those features yet it is a strict regression.

-Peff

---
diff --git a/midx.c b/midx.c
index a75ea99a0d..79ce6a1e3b 100644
--- a/midx.c
+++ b/midx.c
@@ -134,22 +134,26 @@ static struct multi_pack_index *load_multi_pack_index_one(struct odb_source *sou
 
 	CALLOC_ARRAY(m, 1);
 	m->data = midx_map;
 	m->data_len = midx_size;
 	m->source = source;
 
 	m->signature = get_be32(m->data);
-	if (m->signature != MIDX_SIGNATURE)
-		die(_("multi-pack-index signature 0x%08x does not match signature 0x%08x"),
+	if (m->signature != MIDX_SIGNATURE) {
+		error(_("multi-pack-index signature 0x%08x does not match signature 0x%08x"),
 		      m->signature, MIDX_SIGNATURE);
+		goto cleanup_fail;
+	}
 
 	m->version = m->data[MIDX_BYTE_FILE_VERSION];
-	if (m->version != MIDX_VERSION)
-		die(_("multi-pack-index version %d not recognized"),
+	if (m->version != MIDX_VERSION) {
+		error(_("multi-pack-index version %d not recognized"),
 		      m->version);
+		goto cleanup_fail;
+	}
 
 	hash_version = m->data[MIDX_BYTE_HASH_VERSION];
 	if (hash_version != oid_version(r->hash_algo)) {
 		error(_("multi-pack-index hash version %u does not match version %u"),
 		      hash_version, oid_version(r->hash_algo));
 		goto cleanup_fail;
 	}

  reply	other threads:[~2026-04-16  5:17 UTC|newest]

Thread overview: 30+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-04-14 15:22 [ANNOUNCE] Git v2.54.0-rc2 Junio C Hamano
2026-04-15 20:50 ` MIDX woes, was " Johannes Schindelin
2026-04-15 21:04   ` Junio C Hamano
2026-04-16  5:17     ` Jeff King [this message]
2026-04-16  5:34       ` Jeff King
2026-04-16 13:24         ` Derrick Stolee
2026-04-16 16:09           ` Junio C Hamano
2026-04-16 20:29             ` Taylor Blau
2026-04-19 22:41               ` Derrick Stolee
2026-04-20  1:52                 ` Junio C Hamano
2026-04-16 20:26           ` Taylor Blau
2026-04-16 23:29             ` Jeff King
2026-04-16 18:10         ` Junio C Hamano
2026-04-16 18:18           ` Junio C Hamano
2026-04-16 19:49             ` Jeff King
2026-04-16 20:12               ` Junio C Hamano
2026-04-16 23:23                 ` Jeff King
2026-04-17  4:15                   ` Junio C Hamano
2026-04-16 18:45           ` [PATCH] MIDX: revert the default version to v1 Junio C Hamano
2026-04-16 19:38             ` Junio C Hamano
2026-04-16 20:58               ` Junio C Hamano
2026-04-16 21:13                 ` Taylor Blau
2026-04-16 20:06             ` Jeff King
2026-04-16 20:55               ` Junio C Hamano
2026-04-16 23:24                 ` Jeff King
2026-04-16 23:26                   ` Jeff King
2026-04-16 21:12               ` Taylor Blau
2026-04-16 23:27                 ` Jeff King
2026-04-17 15:19 ` [ANNOUNCE] Git v2.54.0-rc2 Junio C Hamano
2026-04-17 17:03   ` Elijah Newren

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20260416051732.GA48541@coredump.intra.peff.net \
    --to=peff@peff.net \
    --cc=Johannes.Schindelin@gmx.de \
    --cc=git@vger.kernel.org \
    --cc=gitster@pobox.com \
    --cc=me@ttaylorr.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox