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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.