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;
}
next prev parent 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