{"thread":{"id":"65482","subject":"[ANNOUNCE] Git v2.54.0-rc2","startedAt":"2026-04-14T15:22:42Z","lastAt":"2026-04-20T01:52:55Z","messageCount":30,"participants":["Junio C Hamano","Johannes Schindelin","Jeff King","Derrick Stolee","Taylor Blau","Elijah Newren"],"isPatch":false,"patchVersion":null,"patchTotal":null},"messages":[{"id":"541565","messageId":"xmqqqzohd0sh.fsf@gitster.g","threadId":"65482","inReplyTo":null,"subject":"[ANNOUNCE] Git v2.54.0-rc2","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2026-04-14T15:22:38Z","receivedAt":"2026-04-14T15:22:42Z","isPatch":false,"body":"A release candidate Git v2.54.0-rc2 is now available for testing at\nthe usual places.  It is comprised of 744 non-merge commits since\nv2.53.0, contributed by 127 people, 64 of which are new faces [*].\n\nRelative to Git 2.54-rc1, it contains many minor but a few notable\nclean-ups like reverting the writev() series that had portability\nissues.  Hopefully we can tag the final next week without having to\ndo any major last-minute scrambling.\n\nThe tarballs are found at:\n\n    https://www.kernel.org/pub/software/scm/git/testing/\n\nThe following public repositories all have a copy of the\n'v2.54.0-rc2' tag and the 'master' branch that the tag points at:\n\n  url = https://git.kernel.org/pub/scm/git/git\n  url = https://kernel.googlesource.com/pub/scm/git/git\n  url = git://repo.or.cz/alt-git.git\n  url = https://github.com/gitster/git\n\nNew contributors whose contributions weren't in v2.53.0 are as follows.\nWelcome to the Git development community!\n\n  Abdalrhman Mohamed, Aditya, Amisha Chhajed, Andrew Au, Ashlesh\n  Gawande, Ashwani Kumar Kamal, Bilal El Khatabi, Burak Kaan\n  Karaçay, Chris Darroch, Chris Idema, Christian Heusel, Claus\n  Schneider(Eficode), cuiweixie, Dan Drake, Daniel D. Beck, David\n  Timber, Eric Ju, Francesco Paparatto, Gabriel “gabldotink”,\n  Guillaume Jacob, Gusted, HodaSalim, Jakob Haufe, Jayesh Daga,\n  Jialong Wang, Joaquim Rocha, Jo Liss, Jonatan Holmgren, Lambert\n  Duclos-de Guise, Li Chen, LorenzoPegorari, Luca Stefani, Lukas\n  Wanko, Mahi Kassa, Mansi Singh, Matěj Cepl, Matthew Gabeler-Lee,\n  Matthias Beyer, Michael Montalbo, Mirko Faina, Nick Golden,\n  Omri Sarig, Pablo Sabater, PRASHANT S BISHT, Quentin Bernet,\n  Ritesh Singh Jadoun, Rito Rhymes, Runxi Yu, Sahitya Chandra,\n  Samo Pogačnik, Samuel Thibault, Scott Baker, Seth McDonald,\n  Seyi Kufoiji, Shannon Barber, Siddharth Shrimali, SoutrikDas,\n  Trieu Huynh, Vaidas Pilkauskas, Wang Zichong, Wolfgang Faust,\n  Yannik Tausch, Yuvraj Singh Chauhan, and Zakariyah Ali.\n\nReturning contributors who helped this release are as follows.\nThanks for your continued support.\n\n  Aaron Plattner, Abraham Samuel Adekunle, Aditya Garg, Adrian\n  Ratiu, Beat Bolli, brian m. carlson, Chris Packham, Christian\n  Couder, Christoph Anton Mitterer, Colin Stagner, Collin Funk,\n  D. Ben Knoble, Derrick Stolee, Deveshi Dwivedi, Elijah Newren,\n  Emily Shaffer, Eric Sunshine, George, Han Young, Harald Nordgren,\n  Jacob Keller, Jean-Noël Avila, Jeff King, Jiang Xin, Johannes\n  Schindelin, Johannes Sixt, Junio C Hamano, Justin Tobler, Karthik\n  Nayak, K Jayatheerth, Koji Nakamaru, Kristoffer Haugsbakk, Lucas\n  De Marchi, Lucas Seiki Oshiro, Matheus Tavares, Mathias Rav,\n  Matthew Hughes, Matthew John Cheetham, Matthias Aßhauer, Matt\n  Smiley, Nasser Grainawi, Olamide Caleb Bello, Patrick Steinhardt,\n  Paulo Casaretto, Paul Tarjan, Phil Hord, Phillip Wood, Pushkar\n  Singh, Ramsay Jones, Randall S. Becker, René Scharfe, Sam\n  Bostock, Shreyansh Paliwal, Siddharth Asthana, Simon Cheng,\n  SZEDER Gábor, Taylor Blau, Tian Yuchen, Todd Zullinger, Toon\n  Claes, Usman Akinyemi, Uwe Kleine-König, and Yee Cheng Chin.\n\n[*] We are counting not just the authorship contribution but issue\n    reporting, mentoring, helping and reviewing that are recorded in\n    the commit trailers.\n\n----------------------------------------------------------------\n\nGit v2.54 Release Notes (draft)\n===============================\n\nUI, Workflows & Features\n------------------------\n\n * \"git add -p\" and friends note what the current status of the hunk\n   being shown is.\n\n * \"git history\" history rewriting (experimental) command has been\n   added.\n\n * \"git replay\" is taught to drop commits that become empty (not the\n   ones that are empty in the original).\n\n * The help text and the documentation for the \"--expire\" option of\n   \"git worktree [list|prune]\" have been improved.\n\n * When \"git show-index\" is run outside a repository, it silently\n   defaults to SHA-1; the tool now warns when this happens.\n\n * \"git merge-file\" can be run outside a repository, but it ignored\n   all configuration, even the per-user ones.  The command now uses\n   available configuration files to find its customization.\n\n * \"auto filter\" logic for large-object promisor remote.\n\n * \"git rev-list\" and friends learn \"--maximal-only\" to show only the\n   commits that are not reachable by other commits.\n\n * Command line completion (in contrib/) update for\n   \"stash import/export\".\n\n * \"git repo info\" learns \"--keys\" action to list known keys.\n\n * Extend the alias configuration syntax to allow aliases using\n   characters outside ASCII alphanumeric (plus '-').\n\n * A signature on a commit that was GPG signed long time ago ought to\n   be still valid after the key that was used to sign it has expired,\n   but we showed them in alarming red.\n\n * \"git subtree split --prefix=P <commit>\" now checks the prefix P\n   against the tree of the (potentially quite different from the\n   current working tree) given commit.\n\n * \"git add -p\" learned a new mode that allows the user to revisit a\n   file that was already dealt with.\n\n * Allow the directory in which reference backends store their data to\n   be specified.\n\n * \"gitweb\" has been taught to be mobile friendly.\n\n * \"git apply --directory=./un/../normalized/path\" now normalizes the\n   given path before using it.\n\n * \"git maintenance\" starts using the \"geometric\" strategy by default.\n\n * \"git config list\" is taught to show the values interpreted for\n   specific type with \"--type=<X>\" option.\n\n * \"git add <submodule>\" has been taught to honor\n   submodule.<name>.ignore that is set to \"all\" (and requires \"git add\n   -f\" to override it).\n\n * Hook commands are now allowed to be defined (possibly centrally)\n   in the configuration files, and run multiple of them for the same\n   hook event.\n\n * The way end-users can add their own \"git <cmd>\" subcommand by\n   storing \"git-<cmd>\" in a directory on their $PATH has not been\n   documented clearly, which has been corrected.\n\n * \"git send-email\" learns to pass hostname/port to Authen::SASL\n   module.\n\n * \"git send-email\" learns to support use of client-side certificates.\n\n * \"git send-email\" has learned to be a bit more careful when it\n   accepts charset to use from the end-user, to avoid 'y' (mistaken\n   'yes' when expecting a charset like 'UTF-8') and other nonsense.\n\n * \"git status\" learned to show comparison between the current branch\n   and various other branches listed on status.compareBranches\n   configuration.\n\n * \"git repo structure\" command learns to report maximum values on\n   various aspects of objects it inspects.\n\n * \"git rebase\" learns \"--trailer\" command to drive the\n   interpret-trailers machinery.\n\n * \"git fast-import\" learned to optionally replace signature on\n   commits whose signatures get invalidated due to replaying by\n   signing afresh.\n\n * \"git history\" learned the \"split\" subcommand.\n\n * The reference-transaction hook was taught to be triggered before\n   taking locks on references in the \"preparing\" phase.\n\n * \"git apply\" now reports the name of the input file along with the\n   line number when it encounters a corrupt patch, and correctly\n   resets the line counter when processing multiple patch files.\n\n * The HTTP transport learned to react to \"429 Too Many Requests\".\n\n * \"git repo info -h\" and \"git repo structure -h\" limit their help output\n   to the part that is specific to the subcommand.\n\n * \"git format-patch --cover-letter\" learns to use a simpler format\n   instead of the traditional shortlog format to list its commits with\n   a new --commit-list-format option and format.commitListFormat\n   configuration variable.\n\n * `git backfill` learned to accept revision and pathspec arguments.\n\n * \"git replay\" (experimental) learns, in addition to \"pick\" and\n   \"replay\", a new operating mode \"revert\".\n\n * git replay now supports replaying down to the root commit.\n\n * Handling of signed commits and tags in fast-import has been made more\n   configurable.\n\n * \"git config list\" is the official way to spell \"git config -l\" and\n   \"git config --list\".  Use it to update the documentation.\n\n\nPerformance, Internal Implementation, Development Support etc.\n--------------------------------------------------------------\n\n * Avoid local submodule repository directory paths overlapping with\n   each other by encoding submodule names before using them as path\n   components.\n\n * The string_list API gains a new helper, string_list_sort_u(), and\n   new unit tests to extend coverage.\n\n * Improve set-up time of a perf test.\n\n * ISO C23 redefines strchr and friends that traditionally took\n   a const pointer and returned a non-const pointer derived from it to\n   preserve constness (i.e., if you ask for a substring in a const\n   string, you get a const pointer to the substring).  Update code\n   paths that used non-const pointer to receive their results that did\n   not have to be non-const to adjust.\n\n * Rename three functions around the commit_list data structure.\n\n * Transaction to create objects (or not) is currently tied to the\n   repository, but in the future a repository can have multiple object\n   sources, which may have different transaction mechanisms.  Make the\n   odb transaction API per object source.\n\n * \"git merge-ours\" is taught to work better in a sparse checkout.\n\n * Allow recording process ID of the process that holds the lock next\n   to a lockfile for diagnosis.\n\n * Reduce dependency on the_repository of xdiff-interface layer.\n\n * Code clean-up to use the commit_stack API.\n\n * \"git diff --anchored=<text>\" has been optimized.\n\n * A CodingGuidelines update.\n\n * Add process ancestry data to trace2 on macOS to match what we\n   already do on Linux and Windows.  Also adjust the way Windows\n   implementation reports this information to match the other two.\n\n * A handful of places used refs_for_each_ref_in() API incorrectly,\n   which has been corrected.\n\n * Some tests assumed \"iconv\" is available without honoring ICONV\n   prerequisite, which has been corrected.\n\n * Revamp object enumeration API around odb.\n\n * Additional tests were introduced to see the interaction with netrc\n   auth with auth failure on the http transport.\n\n * A couple of bugs in use of flag bits around odb API has been\n   corrected, and the flag bits reordered.\n\n * Plumb gitk/git-gui build and install procedure in meson based\n   builds.\n\n * The code to accept shallow \"git push\" has been optimized.\n\n * Simplify build procedure for oxskeychain (in contrib/).\n\n * Fix dependency screw-up in meson-based builds.\n\n * Wean the mailmap code off of the_repository dependency.\n\n * API clean-up for the worktree subsystem.\n\n * The last uses of the_repository in \"tree-diff.c\" have been\n   eradicated.\n\n * Clean-up the code around \"git repo info\" command.\n\n * Mark the merge-ort codebase to prevent more uses of the_repository\n   from getting added.\n\n * The core.attributesfile is intended to be set per repository, but\n   were kept track of by a single global variable in-core, which has\n   been corrected by moving it to per-repository data structure.\n\n * Use the hook API to replace ad-hoc invocation of hook scripts via\n   the run_command() API.\n\n * Code refactoring around refs-for-each-* API functions.\n\n * The parse-options API learned to notice an options[] array with\n   duplicated long options.\n   (merge 237e520d81 rs/parse-options-duplicated-long-options later to maint).\n\n * The code to maintain mapping between object names in multiple hash\n   functions is being added, written in Rust.\n\n * A bit of OIDmap API enhancement and cleanup.\n\n * Move gitlab CI from macOS 14 images that are being deprecated.\n\n * The object source API is getting restructured to allow plugging new\n   backends.\n\n * Reduce dependence on the global the_hash_algo and the_repository\n   variables of wt-status code path.\n\n  * The way combined list-object filter options are parsed has been\n    revamped.\n\n * Editorconfig filename patterns were specified incorrectly, making\n   many source files inside subdirectories unaffected, which has been\n   corrected.\n\n * The run_command() API lost its implicit dependency on the singleton\n   `the_repository` instance.\n\n * The unit test helper function was taught to use backslash +\n   mnemonic notation for certain control characters like \"\\t\", instead\n   of octal notation like \"\\011\".\n\n * Adjust test-lint to allow \"sed -E\" to use ERE in the patterns.\n\n * Clar (unit testing framework) update from the upstream.\n\n * Reduce system overhead \"git upload-pack\" spends on relaying \"git\n   pack-objects\" output to the \"git fetch\" running on the other end of\n   the connection.\n\n * Add a coccinelle rule to break the build when \"struct strbuf\" gets\n   passed by value.\n\n * Further work on incremental repacking using MIDX/bitmap\n\n * The logic to count objects has been cleaned up.\n\n * Tweak the build infrastructure by moving tools around.\n\n * Uses of prio_queue as a LIFO stack of commits have been written\n   with commit_stack.\n\n * The cleanup of remaining bitmaps in \"ahead_behind()\" has been\n   simplified.\n\n * split-index.c has been updated to not use the global the_repository\n   and the_hash_algo variables.\n\n * The unsigned integer that is used as an bitset to specify the kind\n   of branches interpret_branch_name() function has been changed to\n   use a dedicated enum type.\n\n * Various updates to contrib/diff-highlight, including documentation\n   updates, test improvements, and color configuration handling.\n\n * Code paths that loop over another array to push each element into a\n   strvec have been rewritten to use strvec_pushv() instead.\n\n * In case homebrew breaks REG_ENHANCED again, leave a in-code comment\n   to suggest use of our replacement regex as a workaround.\n\n * MinGW build updates.\n\n * The way dash 0.5.13 handles non-ASCII contents in here-doc\n   is buggy and breaks our existing tests, which unfortunately\n   have been rewritten to avoid triggering the bug.\n\n * Object name handling (disambiguation and abbreviation) has been\n   refactored to be backend-generic, moving logic into the respective\n   object database backends.\n\n * pack-objects's --stdin-packs=follow mode learns to handle\n   excluded-but-open packs.\n\n * A few code paths that spawned child processes for network\n   connection weren't wait(2)ing for their children and letting \"init\"\n   reap them instead; they have been tightened.\n\n * Adjust the codebase for C23 that changes functions like strchr()\n   that discarded constness when they return a pointer into a const\n   string to preserve constness.\n\n * A handful of inappropriate uses of the_repository have been\n   rewritten to use the right repository structure instance in the\n   read-cache.c codepath.\n\n * Internals of \"git fsck\" have been refactored to not depend on the\n   global `the_repository` variable.\n\n * Reduce dependency on `the_repository` in add-patch.c file.\n\n * The way the \"git log -L<range>:<file>\" feature is bolted onto the\n   log/diff machinery is being reworked a bit to make the feature\n   compatible with more diff options, like -S/G.\n\n * Further work to adjust the codebase for C23 that changes functions\n   like strchr() that discarded constness when they return a pointer into\n   a const string to preserve constness.\n\n * \"git rev-list --maximal-only\" has been optimized by borrowing the\n   logic used by \"git show-branch --independent\", which computes the\n   same kind of information much more efficiently.\n\n\nFixes since v2.53\n-----------------\n\n * HTTP transport failed to authenticate in some code paths, which has\n   been corrected.\n   (merge ed0f7a62f7 ap/http-probe-rpc-use-auth later to maint).\n\n * The computation of column width made by \"git diff --stat\" was\n   confused when pathnames contain non-ASCII characters.\n   (merge 04f5d95ef7 lp/diff-stat-utf8-display-width-fix later to maint).\n\n * The \"-z\" and \"--max-depth\" documentation (and implementation of\n   \"-z\") in the \"git last-modified\" command have been updated.\n   (merge 9dcc09bed1 tc/last-modified-options-cleanup later to maint).\n\n * A handful of code paths that started using batched ref update API\n   (after Git 2.51 or so) lost detailed error output, which have been\n   corrected.\n   (merge eff9299eac kn/ref-batch-output-error-reporting-fix later to maint).\n\n * \"git blame --ignore-revs=... --color-lines\" did not account for\n   ignored revisions passing blame to the same commit an adjacent line\n   gets blamed for.\n   (merge d519082d4e rs/blame-ignore-colors-fix later to maint).\n\n * Coccinelle rules update.\n   (merge 60614838a4 tc/memzero-array later to maint).\n\n * Giving \"git last-modified\" a tree (not a commit-ish) died an\n   uncontrolled death, which has been corrected.\n   (merge 525ef52301 tc/last-modified-not-a-tree later to maint).\n\n * Test contrib/ things in CI to catch breakages before they enter the\n   \"next\" branch.\n   (merge c591c3ceff jc/ci-test-contrib-too later to maint).\n\n * A handful of documentation pages have been modernized to use the\n   \"synopsis\" style.\n   (merge a34d1d53a6 ja/doc-synopsis-style-even-more later to maint).\n\n * Small clean-up of xdiff library to remove unnecessary data\n   duplication.\n   (merge 5086213bd2 pw/xdiff-cleanups later to maint).\n\n * Update sample commit-msg hook to complain when a log message has\n   material mailinfo considers the end of log message in the middle.\n   (merge 83804c361b pw/commit-msg-sample-hook later to maint).\n\n * \"git pack-objects --stdin-packs\" with \"--exclude-promisor-objects\"\n   fetched objects that are promised, which was not wanted.  This has\n   been fixed.\n   (merge f4eff7116d ps/pack-concat-wo-backfill later to maint).\n\n * \"git switch <name>\", in an attempt to create a local branch <name>\n   after a remote tracking branch of the same name gave an advise\n   message to disambiguate using \"git checkout\", which has been\n   updated to use \"git switch\".\n   (merge 12fee11f21 jc/checkout-switch-restore later to maint).\n\n * It does not make much sense to apply the \"incomplete-line\"\n   whitespace rule to symbolic links, whose contents almost always\n   lack the final newline.  \"git apply\" and \"git diff\" are now taught\n   to exclude them for a change to symbolic links.\n   (merge 6a41481c6d jc/whitespace-incomplete-line later to maint).\n\n * \"git format-patch --from=<me>\" did not honor the command line\n   option when writing out the cover letter, which has been corrected.\n\n * Update build precedure for mergetool documentation in meson-based builds.\n   (merge 58e4eeeeb5 pw/meson-doc-mergetool later to maint).\n\n * An earlier attempt to optimize \"git subtree\" discarded too much\n   relevant histories, which has been corrected.\n\n * A prefetch call can be triggered to access a stale diff_queue entry\n   after diffcore-break breaks a filepair into two and freed the\n   original entry that is no longer used, leading to a segfault, which\n   has been corrected.\n   (merge 2d88ab078d hy/diff-lazy-fetch-with-break-fix later to maint).\n\n * \"git fetch --deepen\" that tries to go beyond merged branch used to\n   get confused where the updated shallow points are, which has been\n   corrected.\n   (merge 3ef68ff40e sp/shallow-deepen-relative-fix later to maint).\n\n * \"fsck\" iterates over packfiles and its access to pack data caused\n   the list to be permuted, which caused it to loop forever; the code\n   to access pack data by \"fsck\" has been updated to avoid this.\n   (merge 13eb65d366 ps/fsck-stream-from-the-right-object-instance later to maint).\n\n * \"git log --graph --stat\" did not count the display width of colored\n   graph part of its own output correctly, which has been corrected.\n   (merge 064b869efc lp/diff-stat-utf8-display-width-fix later to maint).\n\n * The configuration variable format.noprefix did not behave as a\n   proper boolean variable, which has now been fixed and documented.\n   (merge ea3a62c40e kh/format-patch-noprefix-is-boolean later to maint).\n\n * CI fix.\n   (merge eb35167dd4 ps/ci-reduce-gitlab-envsize later to maint).\n\n * \"git diff --no-index --find-object=<object-name>\" outside a\n   repository of course wouldn't be able to find the object and died\n   while parsing the command line.  The command is made to die in a\n   bit more user-friendly way.\n   (merge b0ddc7947c mm/diff-no-index-find-object later to maint).\n\n * Fix typo-induced breakages in fsmonitor-watchman sample hook.\n   (merge 41366e4677 pt/fsmonitor-watchman-sample-fix later to maint).\n\n * \"git for-each-repo\" started from a secondary worktree did not work\n   as expected, which has been corrected.\n   (merge e87493b9b4 ds/for-each-repo-w-worktree later to maint).\n\n * The construct 'test \"$(command)\" = expectation' loses the exit\n   status from the command, which has been fixed by breaking up the\n   statement into pieces.\n   (merge d3edca979a fp/t3310-unhide-git-failures later to maint).\n\n * While discovering a \".git\" directory, the code treats any stat()\n   failure as a sign that a filesystem entity .git does not exist\n   there, and ignores \".git\" that is not a \"gitdir\" file or a\n   directory.  The code has been tightened to notice and report\n   filesystem corruption better.\n   (merge 1dd27bfbfd ty/setup-error-tightening later to maint).\n\n * Plug a few leaks where mmap'ed memory regions are not unmapped.\n   (merge a8a69bbb64 jk/unleak-mmap later to maint).\n\n * A test now uses the symbolic constant $ZERO_OID instead of 40 \"0\" to\n   work better with SHA-256 as well as SHA-1.\n   (merge 30310f3cc4 ss/t3200-test-zero-oid later to maint).\n\n * Instead of hardcoded 'origin', use the configured default remote\n   when fetching from submodules.\n   (merge 3b5fb32da8 ng/submodule-default-remote later to maint).\n\n * The code in \"git help\" that shows configuration items in sorted\n   order was awkwardly organized and prone to bugs.\n\n * \"imap-send\" used to use functions whose use is going to be removed\n   with OpenSSL 4.0; rewrite them using public API that has been\n   available since OpenSSL 1.1 since 2016 or so.\n   (merge 6392a0b75d bb/imap-send-openssl-4.0-prep later to maint).\n\n * Fix an example in the user-manual.\n   (merge 5514f14617 gj/user-manual-fix-grep-example later to maint).\n\n * The final clean-up phase of the diff output could turn the result of\n   histogram diff algorithm suboptimal, which has been corrected.\n   (merge e417277ae9 yc/histogram-hunk-shift-fix later to maint).\n\n * \"git diff -U<num>\" was too lenient in its command line parsing and\n   took an empty string as a valid <num>.\n   (merge 4f6a803aba ty/doc-diff-u-wo-number later to maint).\n\n * The handling of the incomplete lines at the end by \"git\n   diff-highlight\" has been fixed.\n\n * merge-file --object-id used to trigger a BUG when run in a linked\n   worktree, which has been fixed.\n   (merge 57246b7c62 mr/merge-file-object-id-worktree-fix later to maint).\n\n * \"git apply -p<n>\" parses <n> more carefully now.\n   (merge d05d84c5f5 mf/apply-p-no-atoi later to maint).\n\n * A test to run a .bat file with whitespaces in the name with arguments\n   with whitespaces in them was flaky in that sometimes it got killed\n   before it produced expected side effects, which has been rewritten to\n   make it more robust.\n   (merge 3ad4921838 jk/t0061-bat-test-update later to maint).\n\n * \"git ls-remote '+refs/tags/*:refs/tags/*' https://...\" run outside a\n   repository would dereference a NULL while trying to see if the given\n   refspec is a single-object refspec, which has been corrected.\n   (merge 4e5dc601dd kj/refspec-parsing-outside-repository later to maint).\n\n * Fix a regression in writing the commit-graph where commits with dates\n   exceeding 34 bits (beyond year 2514) could cause an underflow and\n   crash Git during the generation data overflow chunk writing.\n\n * The value of a wrong pointer variable was referenced in an error\n   message that reported that it shouldn't be NULL.\n   (merge 753ecf4205 yc/path-walk-fix-error-reporting later to maint).\n\n * The check in \"receive-pack\" to prevent a checked out branch from\n   getting updated via updateInstead mechanism has been corrected.\n\n * \"git backfill\" is capable of auto-detecting a sparsely checked out\n   working tree, which was broken.\n   (merge 339eba65a7 th/backfill-auto-detect-sparseness-fix later to maint).\n\n * add_files_to_cache() used diff_files() to detect only the paths that\n   are different between the index and the working tree and add them,\n   which does not need rename detection, which interfered with unnecessary\n   conflicts.\n   (merge c0ce43376b ng/add-files-to-cache-wo-rename later to maint).\n\n * Doc mark-up update for entries in the glossary with bulleted lists.\n   (merge a65cbd87ea jk/doc-markup-sub-list-indentation later to maint).\n\n * CI dependency updates.\n   (merge 4bdb17e3a8 jc/ci-github-actions-use-checkout-v5 later to maint).\n\n * Other code cleanup, docfix, build fix, etc.\n   (merge d79fff4a11 jk/remote-tracking-ref-leakfix later to maint).\n   (merge 7a747f972d dd/t5403-modernise later to maint).\n   (merge 81021871ea sp/myfirstcontribution-include-update later to maint).\n   (merge 49223593fd ac/sparse-checkout-string-list-cleanup later to maint).\n   (merge a824421d36 sp/t5500-cleanup later to maint).\n   (merge df1c5d7ed7 kh/doc-shortlog-fix later to maint).\n   (merge 2d45507f15 am/doc-github-contributiong-link-to-submittingpatches later to maint).\n   (merge 68060b9262 hs/t9160-test-paths later to maint).\n   (merge 486386c687 cs/subtree-reftable-testfix later to maint).\n   (merge 0728012c53 jc/diff-highlight-main-master-testfix later to maint).\n   (merge 831989ef38 mc/doc-send-email-signed-off-by-cc later to maint).\n   (merge c44b3f3203 sd/doc-my1c-api-config-reference-fix later to maint).\n   (merge 6c21e53bad rs/version-wo-the-repository later to maint).\n   (merge 10c68d2577 rs/clean-includes later to maint).\n   (merge 168d575719 bk/t2003-modernise later to maint).\n   (merge 6bfef81c9a kh/doc-rerere-options-xref later to maint).\n   (merge aaf3cc3d8d sd/t7003-test-path-is-helpers later to maint).\n   (merge 2668b6bdc4 jc/doc-rerere-update later to maint).\n   (merge 2f99f50f2d jc/doc-cg-c-comment later to maint).\n   (merge a454cdca42 kh/doc-am-format-sendmail later to maint).\n   (merge 8b0061b5c5 jk/ref-filter-lrstrip-optim later to maint).\n   (merge 5133837392 ps/ci-gitlab-msvc-updates later to maint).\n   (merge 143e84958c db/doc-fetch-jobs-auto later to maint).\n   (merge 0678e01f02 ap/use-test-seq-f-more later to maint).\n   (merge 96286f14b0 ty/symlinks-use-unsigned-for-bitset later to maint).\n   (merge b10e0cb1f3 kh/doc-am-xref later to maint).\n   (merge ed84bc1c0d kh/doc-patch-id-4 later to maint).\n   (merge 7451864bfa sc/pack-redundant-leakfix later to maint).\n   (merge f87593ab1a cx/fetch-display-ubfix later to maint).\n   (merge a66c8c7f91 jk/repo-structure-cleanup later to maint).\n   (merge 5ee8782f87 ss/test-that-that-typofix later to maint).\n   (merge f31b322008 fp/t3310-test-path-is-helpers later to maint).\n   (merge b22ed4c4f9 kj/path-micro-code-cleanup later to maint).\n   (merge a56fa1ca05 lp/doc-gitprotocol-pack-fixes later to maint).\n   (merge 0d6bb8b541 ss/t3700-modernize later to maint).\n   (merge 63c00a677b ss/t9123-setup-inside-test-expect-success later to maint).\n   (merge beca0ca4be os/doc-git-custom-commands later to maint).\n   (merge 4c223571be ty/patch-ids-document-lazy-eval later to maint).\n   (merge 476365ac85 jc/doc-wholesale-replace-before-next later to maint).\n   (merge 35f220b639 ss/submodule--helper-use-xmalloc later to maint).\n   (merge 02cbae61df cf/constness-fixes later to maint).\n   (merge 69efd53c81 ms/t7605-test-path-is-helpers later to maint).\n   (merge d39cef3a1a ss/t0410-delete-object-cleanup later to maint).\n   (merge 2f05039717 rj/pack-refs-tests-path-is-helpers later to maint).\n   (merge 2594747ad1 jk/transport-color-leakfix later to maint).\n   (merge 48430e44ac mf/t0008-cleanup later to maint).\n   (merge fc8a4f15e7 gi/doc-boolean-config-typofix later to maint).\n   (merge 37182267a0 kh/doc-interpret-trailers-1 later to maint).\n   (merge f64c50e768 jc/rerere-modern-strbuf-handling later to maint).\n   (merge 699248d89e th/t8003-unhide-git-failures later to maint).\n   (merge d8e34f971b za/t2000-modernise later to maint).\n   (merge 849988bc74 th/t6101-unhide-git-failures later to maint).\n   (merge 0f0ce07625 sp/doc-gitignore-oowt later to maint).\n\n----------------------------------------------------------------\n\nChanges since v2.53.0 are as follows:\n\nAaron Plattner (2):\n      remote-curl: use auth for probe_rpc() requests too\n      t: use test_seq -f and pipes in a few more places\n\nAbdalrhman Mohamed (1):\n      .github/CONTRIBUTING.md: link to SubmittingPatches on git-scm.com\n\nAbraham Samuel Adekunle (5):\n      add -p: show user's hunk decision when selecting hunks\n      interactive -p: add new `--auto-advance` flag\n      add-patch: modify patch_update_file() signature\n      add-patch: allow all-or-none application of patches\n      add-patch: allow interfile navigation when selecting hunks\n\nAditya (1):\n      t2107: modernize path existence check\n\nAditya Garg (1):\n      send-email: pass smtp hostname and port to Authen::SASL\n\nAdrian Ratiu (36):\n      submodule--helper: use submodule_name_to_gitdir in add_submodule\n      submodule: always validate gitdirs inside submodule_name_to_gitdir\n      builtin/submodule--helper: add gitdir command\n      submodule: introduce extensions.submodulePathConfig\n      submodule: allow runtime enabling extensions.submodulePathConfig\n      submodule--helper: add gitdir migration command\n      builtin/credential-store: move is_rfc3986_unreserved to url.[ch]\n      submodule--helper: fix filesystem collisions by encoding gitdir paths\n      submodule: fix case-folding gitdir filesystem collisions\n      submodule: hash the submodule name for the gitdir path\n      submodule: detect conflicts with existing gitdir configs\n      t1800: add hook output stream tests\n      run-command: add helper for pp child states\n      hook: allow separate std[out|err] streams\n      reference-transaction: use hook API instead of run-command\n      hook: add jobs option\n      run-command: poll child input in addition to output\n      hook: add internal state alloc/free callbacks\n      hook: include hooks from the config\n      hook: allow disabling config hooks\n      hook: allow event = \"\" to overwrite previous values\n      hook: add -z option to \"git hook list\"\n      builtin/receive-pack: avoid spinning no-op sideband async threads\n      hook: move unsorted_string_list_remove() to string-list.[ch]\n      builtin/receive-pack: properly init receive_hook strbuf\n      hook: fix minor style issues\n      hook: rename cb_data_free/alloc -> hook_data_free/alloc\n      hook: detect & emit two more bugs\n      hook: replace hook_list_clear() -> string_list_clear_func()\n      hook: make consistent use of friendly-name in docs\n      t1800: add test to verify hook execution ordering\n      hook: introduce hook_config_cache_entry for per-hook data\n      hook: show config scope in git hook list\n      hook: show disabled hooks in \"git hook list\"\n      hook: reject unknown hook names in git-hook(1)\n      t1800: add &&-chains to test helper functions\n\nAmisha Chhajed (5):\n      sparse-checkout: optimize string_list construction and add tests to verify deduplication.\n      u-string-list: add unit tests for string-list methods\n      string-list: add string_list_sort_u() that mimics \"sort -u\"\n      sparse-checkout: use string_list_sort_u\n      help: cleanup the contruction of keys_uniq\n\nAndrew Au (1):\n      transport-helper, connect: use clean_on_exit to reap children on abnormal exit\n\nAshlesh Gawande (1):\n      t5550: add netrc tests for http 401/403\n\nAshwani Kumar Kamal (1):\n      t9812: modernize test path helpers\n\nBeat Bolli (3):\n      imap-send: use the OpenSSL API to access the subject alternative names\n      imap-send: use the OpenSSL API to access the subject common name\n      imap-send: move common code into function host_matches()\n\nBilal El Khatabi (1):\n      t5315: use test_path_is_file for loose-object check\n\nBurak Kaan Karaçay (5):\n      t2003: modernize path existence checks using test helpers\n      mailmap: stop using the_repository\n      mailmap: drop global config variables\n      run-command: wean start_command() off the_repository\n      run-command: wean auto_maintenance() functions off the_repository\n\nChris Idema (1):\n      git-gui: shift tabstops to account for the first column of patch text\n\nChristian Couder (9):\n      promisor-remote: refactor initialising field lists\n      promisor-remote: allow a client to store fields\n      clone: make filter_options local to cmd_clone()\n      fetch: make filter_options local to cmd_fetch()\n      doc: fetch: document `--filter=<filter-spec>` option\n      list-objects-filter-options: support 'auto' mode for --filter\n      promisor-remote: keep advertised filters in memory\n      promisor-remote: change promisor_remote_reply()'s signature\n      fetch-pack: wire up and enable auto filter logic\n\nClaus Schneider(Eficode) (5):\n      read-cache: update add_files_to_cache take param ignored_too\n      read-cache: submodule add need --force given ignore=all configuration\n      tests: t2206-add-submodule-ignored: ignore=all and add --force tests\n      tests: fix existing tests when add an ignore=all submodule\n      Documentation: update add --force option + ignore=all config\n\nColin Stagner (5):\n      contrib/subtree: fix tests with reftable backend\n      ci: ubuntu: use GNU coreutils for dirname\n      contrib/subtree: capture additional test-cases\n      contrib/subtree: test history depth\n      contrib/subtree: process out-of-prefix subtrees\n\nCollin Funk (4):\n      global: constify some pointers that are not written to\n      gpg-interface: remove an unnecessary NULL initialization\n      bloom: remove a misleading const qualifier\n      dir: avoid -Wdiscarded-qualifiers in remove_path()\n\nD. Ben Knoble (2):\n      completion: add stash import, export\n      build: regenerate config-list.h when Documentation changes\n\nDaniel D. Beck (1):\n      doc: fetch: document `--jobs=0` behavior\n\nDavid Timber (1):\n      send-email: add client certificate options\n\nDerrick Stolee (27):\n      revision: add --maximal-only option\n      config: move show_all_config()\n      config: add 'gently' parameter to format_config()\n      config: make 'git config list --type=<X>' work\n      config: format int64s gently\n      config: format bools gently\n      config: format bools or ints gently\n      config: format bools or strings in helper\n      config: format paths gently\n      config: format expiry dates quietly\n      color: add color_parse_quietly()\n      config: format colors quietly\n      config: restructure format_config()\n      config: use an enum for type\n      for-each-repo: test outside of repo context\n      run-command: extract sanitize_repo_env helper\n      for-each-repo: work correctly in a worktree\n      for-each-repo: simplify passing of parameters\n      revision: include object-name.h\n      t5620: prepare branched repo for revision tests\n      backfill: accept revision arguments\n      backfill: work with prefix pathspecs\n      path-walk: support wildcard pathspecs for blob filtering\n      t5620: test backfill's unknown argument handling\n      t6600: test --maximal-only and --independent\n      p6011: add perf test for rev-list --maximal-only\n      rev-list: use reduce_heads() for --maximal-only\n\nDeveshi Dwivedi (6):\n      t5403: introduce check_post_checkout helper function\n      t5403: use test_cmp for post-checkout argument checks\n      worktree: do not pass strbuf by value\n      list-objects-filter-options: avoid strbuf_split_str()\n      coccinelle: detect struct strbuf passed by value\n      stash: do not pass strbuf by value\n\nElijah Newren (6):\n      merge,diff: remove the_repository check before prefetching blobs\n      merge-ort: pass repository to write_tree()\n      merge-ort: replace the_repository with opt->repo\n      merge-ort: replace the_hash_algo with opt->repo->hash_algo\n      merge-ort: prevent the_repository from coming back\n      replay: prevent the_repository from coming back\n\nEmily Shaffer (9):\n      run-command: add stdin callback for parallelization\n      hook: provide stdin via callback\n      hook: convert 'post-rewrite' hook in sequencer.c to hook API\n      transport: convert pre-push to hook API\n      receive-pack: convert update hooks to new API\n      receive-pack: convert receive hooks to hook API\n      hook: run a list of hooks to prepare for multihook support\n      hook: add \"git hook list\" command\n      hook: allow out-of-repo 'git hook' invocations\n\nEric Ju (1):\n      refs: add 'preparing' phase to the reference-transaction hook\n\nFrancesco Paparatto (2):\n      t3310: replace test -f/-d with test_path_is_file/test_path_is_dir\n      t3310: avoid hiding failures from rev-parse in command substitutions\n\nGabriel “gabldotink” (1):\n      doc: add missing space on git-config page\n\nGuillaume Jacob (1):\n      doc: fix git grep args order in Quick Reference\n\nHan Young (1):\n      diffcore-break: avoid segfault with freed entries\n\nHarald Nordgren (3):\n      refactor format_branch_comparison in preparation\n      status: add status.compareBranches config for multiple branch comparisons\n      status: clarify how status.compareBranches deduplicates\n\nHodaSalim (1):\n      t9160:modernize test path checking\n\nJayesh Daga (2):\n      read-cache: use istate->repo for trace2 logging\n      cache-tree: use index state repository in trace2 calls\n\nJean-Noël Avila (4):\n      doc: convert git-submodule to synopsis style\n      doc: finalize git-clone documentation conversion to synopsis style\n      doc: fix some style issues in git-clone and for-each-ref-options\n      doc: convert git-show to synopsis style\n\nJeff King (45):\n      remote: return non-const pointer from error_buf()\n      remote: drop const return of tracking_for_push_dest()\n      remote: fix leak in branch_get_push_1() with invalid \"simple\" config\n      remote: always allocate branch.push_tracking_ref\n      ref-filter: factor out refname component counting\n      ref-filter: simplify lstrip_ref_components() memory handling\n      ref-filter: simplify rstrip_ref_components() memory handling\n      ref-filter: avoid strrchr() in rstrip_ref_components()\n      bisect: simplify string_list memory handling\n      ref-filter: clarify lstrip/rstrip component counting\n      check_connected(): delay opening new_pack\n      check_connected(): fix leak of pack-index mmap\n      pack-revindex: avoid double-loading .rev files\n      object-file: fix mmap() leak in odb_source_loose_read_object_stream()\n      Makefile: turn on NO_MMAP when building with LSan\n      meson: turn on NO_MMAP when building with LSan\n      transport: plug leaks in transport_color_config()\n      contrib/diff-highlight: do not highlight identical pairs\n      diff-highlight: mention build instructions\n      diff-highlight: check diff-highlight exit status in tests\n      t: add matching negative attributes to test_decode_color\n      diff-highlight: use test_decode_color in tests\n      diff-highlight: test color config\n      diff-highlight: fetch all config with one process\n      t0061: simplify .bat test\n      revision: make handle_dotdot() interface less confusing\n      rev-parse: simplify dotdot parsing\n      revision: avoid writing to const string for parent marks\n      rev-parse: avoid writing to const string for parent marks\n      config: store allocated string in non-const pointer\n      convert: add const to fix strchr() warnings\n      http: add const to fix strchr() warnings\n      transport-helper: drop const to fix strchr() warnings\n      pager: explicitly cast away strchr() constness\n      run-command: explicitly cast away constness when assigning to void\n      find_last_dir_sep(): convert inline function to macro\n      pseudo-merge: fix disk reads from find_pseudo_merge()\n      skip_prefix(): check const match between in and out params\n      pkt-line: make packet_reader.line non-const\n      range-diff: drop const to fix strstr() warnings\n      http: drop const to fix strstr() warning\n      refs/files-backend: drop const to fix strchr() warning\n      git-compat-util: fix CONST_OUTPARAM typo and indentation\n      run_processes_parallel(): fix order of sigpipe handling\n      gitglossary: fix indentation of sub-lists\n\nJialong Wang (5):\n      t2203: avoid suppressing git status exit code\n      apply: report the location of corrupt patches\n      apply: report input location in header parsing errors\n      apply: report input location in binary and garbage patch errors\n      object-name: turn INTERPRET_BRANCH_* constants into enum values\n\nJiang Xin (3):\n      gitk: i18n: use \"Gitk\" as package name in POT file\n      gitk: ignore generated POT file\n      gitk: l10n: make PO headers identify the Gitk project\n\nJoaquim Rocha (1):\n      apply: normalize path in --directory argument\n\nJohannes Schindelin (2):\n      cmake: use writev(3p) wrapper as needed\n      mingw: use strftime() directly in UCRT builds\n\nJohannes Sixt (2):\n      gitk: fix highlighted remote prefix of branches with directories\n      gitk: commit translation files without file information\n\nJonatan Holmgren (8):\n      help: use list_aliases() for alias listing\n      alias: prepare for subsection aliases\n      alias: support non-alphanumeric names via subsection syntax\n      completion: fix zsh alias listing for subsection aliases\n      doc: fix list continuation in alias subsection example\n      alias: treat empty subsection [alias \"\"] as plain [alias]\n      git, help: fix memory leaks in alias listing\n      doc: fix list continuation in alias.adoc\n\nJunio C Hamano (56):\n      diff-highlight: allow testing with Git 3.0 breaking changes\n      test: optionally test contrib in CI\n      Start 2.54 cycle\n      whitespace: symbolic links usually lack LF at the end\n      checkout: pass program-readable token to unified \"main\"\n      checkout: tell \"parse_remote_branch\" which command is calling it\n      rerere: minor documantation update\n      The second batch\n      The 3rd batch\n      CodingGuidelines: document // comments\n      The 4th batch\n      CodingGuidelines: document NEEDSWORK comments\n      The 5th batch\n      The 6th batch\n      object-file.c: avoid container_of() of a NULL container\n      The 7th batch\n      The 8th batch\n      The 9th batch\n      The 10th batch\n      The 11th batch\n      The 12th batch\n      The 13th batch\n      SubmittingPatches: spell out \"replace fully to pretend to be perfect\"\n      The 14th batch\n      t: allow use of \"sed -E\"\n      The 15th batch\n      The 16th batch\n      The 17th batch\n      apply: fix new-style empty context line triggering incomplete-line check\n      rerere: update to modern representation of empty strbufs\n      The 18th batch\n      cocci: strbuf.buf is never NULL\n      The 19th batch\n      use strvec_pushv() to add another strvec\n      The 20th batch\n      The 21st batch\n      regexp: leave a pointer to resurrect workaround for Homebrew\n      The 22nd batch\n      The 23rd batch\n      The 24th batch\n      Git 2.54-rc0\n      A bit more on top of 2.54-rc0\n      A couple more on top of -rc0\n      A handful before -rc1\n      A bit more before -rc1\n      Git 2.54-rc1\n      A bit more post -rc1\n      A bit more for -rc2\n      Revert \"cmake: use writev(3p) wrapper as needed\"\n      Revert \"sideband: use writev(3p) to send pktlines\"\n      Revert \"wrapper: introduce writev(3p) wrappers\"\n      Revert \"compat/posix: introduce writev(3p) wrapper\"\n      rust: we are way beyond 2.53\n      CI: bump actions/checkout from 4 to 5 for rust-analysis job\n      Hopefully the final tweak before -rc2\n      Git 2.54-rc2\n\nJustin Tobler (21):\n      odb: store ODB source in `struct odb_transaction`\n      object-file: rename transaction functions\n      odb: prepare `struct odb_transaction` to become generic\n      odb: transparently handle common transaction behavior\n      object-file: use `container_of()` to convert from base types\n      builtin/repo: update stats for each object\n      builtin/repo: add helper for printing keyvalue output\n      builtin/repo: collect largest inflated objects\n      builtin/repo: add OID annotations to table output\n      builtin/repo: find commit with most parents\n      builtin/repo: find tree with most entries\n      Documentation: extend guidance for submitting patches\n      commit: remove unused forward declaration\n      gpg-interface: allow sign_buffer() to use default signing key\n      fast-import: add mode to sign commits with invalid signatures\n      fast-export: check for unsupported signing modes earlier\n      fast-import: add 'abort-if-invalid' mode to '--signed-commits=<mode>'\n      fast-import: add 'strip-if-invalid' mode to '--signed-tags=<mode>'\n      fast-import: add 'sign-if-invalid' mode to '--signed-tags=<mode>'\n      fast-import: add 'abort-if-invalid' mode to '--signed-tags=<mode>'\n      object-file: avoid ODB transaction when not writing objects\n\nK Jayatheerth (6):\n      repo: remove unnecessary variable shadow\n      path: remove unused header\n      path: use size_t for dir_prefix length\n      path: remove redundant function calls\n      remote-curl: fall back to default hash outside repo\n      refspec: fix typo in comment\n\nKarthik Nayak (12):\n      refs: skip to next ref when current ref is rejected\n      refs: add rejection detail to the callback function\n      update-ref: utilize rejected error details if available\n      fetch: utilize rejected ref error details\n      receive-pack: utilize rejected ref error details\n      fetch: delay user information post committing of transaction\n      setup: don't modify repo in `create_reference_database()`\n      refs: extract out `refs_create_refdir_stubs()`\n      refs: move out stub modification to generic layer\n      refs: receive and use the reference storage payload\n      refs: allow reference location in refstorage config\n      refs: add GIT_REFERENCE_BACKEND to specify reference backend\n\nKoji Nakamaru (1):\n      osxkeychain: define build targets in the top-level Makefile.\n\nKristoffer Haugsbakk (21):\n      doc: shortlog: put back trailer paragraphs\n      doc: am: normalize git(1) command links\n      doc: am: say that --message-id adds a trailer\n      doc: am: add missing config am.messageId\n      doc: am: fill out hook discussion\n      doc: rerere-options.adoc: link to git-rerere(1)\n      doc: add caveat about round-tripping format-patch\n      doc: patch-id: emphasize multi-patch processing\n      doc: patch-id: add script example\n      doc: patch-id: see also git-cherry(1)\n      format-patch: make format.noprefix a boolean\n      doc: diff-options.adoc: show format.noprefix for format-patch\n      doc: diff-options.adoc: make *.noprefix split translatable\n      doc: interpret-trailers: convert to synopsis style\n      doc: interpret-trailers: normalize and fill out options\n      doc: config: convert trailers section to synopsis style\n      interpret-trailers: use placeholder instead of *\n      doc: replace git config --list/-l with `list`\n      doc: gitcvs-migration: rephrase “man page”\n      doc: am: revert Message-ID trailer claim\n      doc: am: correct to full --no-message-id\n\nLambert Duclos-de Guise (1):\n      t2004: use test_path_is_file instead of test -f\n\nLi Chen (5):\n      interpret-trailers: factor trailer rewriting\n      trailer: libify a couple of functions\n      trailer: append trailers without fork/exec\n      commit, tag: parse --trailer with OPT_STRVEC\n      rebase: support --trailer\n\nLorenzoPegorari (7):\n      diff: improve scaling of filenames in diffstat to handle UTF-8 chars\n      t4073: add test for diffstat paths length when containing UTF-8 chars\n      diff: handle ANSI escape codes in prefix when calculating diffstat width\n      t4052: test for diffstat width when prefix contains ANSI escape codes\n      doc: gitprotocol-pack: fix pronoun-antecedent agreement\n      doc: gitprotocol-pack: improve paragraphs structure\n      doc: gitprotocol-pack: normalize italic formatting\n\nLucas Seiki Oshiro (10):\n      repo: rename the output format \"keyvalue\" to \"lines\"\n      repo: add new flag --keys to git-repo-info\n      CodingGuidelines: instruct to name arrays in singular\n      repo: rename repo_info_fields to repo_info_field\n      repo: replace get_value_fn_for_key by get_repo_info_field\n      repo: rename struct field to repo_info_field\n      t1900: rename t1900-repo to t1900-repo-info\n      t1901: adjust nul format output instead of expected value\n      Documentation/git-repo: replace 'NUL' with '_NUL_'\n      Documentation/git-repo: capitalize format descriptions\n\nMahi Kassa (2):\n      repo: factor repo usage strings into shared macros\n      repo: show subcommand-specific help text\n\nMansi Singh (1):\n      t7605: use test_path_is_file instead of test -f\n\nMathias Rav (1):\n      merge-file: fix BUG when --object-id is used in a worktree\n\nMatthew John Cheetham (6):\n      trace2: add macOS process ancestry tracing\n      build: include procinfo.c impl for macOS\n      trace2: refactor Windows process ancestry trace2 event\n      trace2: emit cmd_ancestry data for Windows\n      test-tool: extend trace2 helper with 400ancestry\n      t0213: add trace2 cmd_ancestry tests\n\nMatthias Aßhauer (2):\n      unify and bump _WIN32_WINNT definition to Windows 8.1\n      compat/winansi: drop pre-Vista workaround\n\nMatěj Cepl (1):\n      doc: send-email: correct --no-signed-off-by-cc misspelling\n\nMichael Montalbo (5):\n      diff: fix crash with --find-object outside repository\n      line-log: fix crash when combined with pickaxe options\n      line-log: route -L output through the standard diff pipeline\n      t4211: add tests for -L with standard diff options\n      doc: note that -L supports patch formatting and pickaxe options\n\nMirko Faina (18):\n      format-patch: fix From header in cover letter\n      pretty.c: add %(count) and %(total) placeholders\n      format-patch: move cover letter summary generation\n      format-patch: add ability to use alt cover format\n      format-patch: add commitListFormat config\n      docs: add usage for the cover-letter fmt feature\n      t0008: improve test cleanup to fix failing test\n      apply.c: fix -p argument parsing\n      pretty.c: better die message %(count) and %(total)\n      format-patch: refactor generate_commit_list_cover\n      format-patch: rename --cover-letter-format option\n      docs/pretty-formats: add %(count) and %(total)\n      format.commitListFormat: strip meaning from empty\n      format-patch: wrap generate_commit_list_cover()\n      format-patch: add preset for --commit-list-format\n      format-patch: --commit-list-format without prefix\n      docs: fix --commit-list-format related entries\n      format-patch: removing unconditional wrapping\n\nNasser Grainawi (1):\n      submodule: fetch missing objects from default remote\n\nNick Golden (1):\n      read-cache: disable renames in add_files_to_cache\n\nOlamide Caleb Bello (3):\n      environment: stop storing `core.attributesFile` globally\n      environment: stop using core.sparseCheckout globally\n      environment: move \"branch.autoSetupMerge\" into `struct repo_config_values`\n\nOmri Sarig (2):\n      doc: add information regarding external commands\n      doc: make it easier to find custom command information\n\nPRASHANT S BISHT (1):\n      t4200: convert test -[df] checks to test_path_* helpers\n\nPablo Sabater (5):\n      test-lib: print escape sequence names\n      t9200: handle missing CVS with skip_all\n      t9200: replace test -f with modern path helper\n      t5516: clean up cloned and new-wt in denyCurrentBranch and worktrees test\n      receive-pack: use worktree HEAD for updateInstead\n\nPatrick Steinhardt (184):\n      builtin/replay: extract core logic to replay revisions\n      builtin/replay: move core logic into \"libgit.a\"\n      replay: small set of cleanups\n      replay: support empty commit ranges\n      replay: support updating detached HEAD\n      wt-status: provide function to expose status for trees\n      builtin: add new \"history\" command\n      builtin/history: implement \"reword\" subcommand\n      commit: rename `copy_commit_list()` to conform to coding guidelines\n      commit: rename `reverse_commit_list()` to conform to coding guidelines\n      commit: rename `free_commit_list()` to conform to coding guidelines\n      odb: rename `FOR_EACH_OBJECT_*` flags\n      odb: fix flags parameter to be unsigned\n      object-file: extract function to read object info from path\n      object-file: introduce function to iterate through objects\n      packfile: extract function to iterate through objects of a store\n      packfile: introduce function to iterate through objects\n      odb: introduce `odb_for_each_object()`\n      builtin/fsck: refactor to use `odb_for_each_object()`\n      treewide: enumerate promisor objects via `odb_for_each_object()`\n      treewide: drop uses of `for_each_{loose,packed}_object()`\n      odb: introduce mtime fields for object info requests\n      builtin/pack-objects: use `packfile_store_for_each_object()`\n      reachable: convert to use `odb_for_each_object()`\n      odb: drop unused `for_each_{loose,packed}_object()` functions\n      meson: wire up gitk and git-gui\n      gitk: fix msgfmt being required\n      builtin/pack-objects: don't fetch objects when merging packs\n      builtin/backfill: fix flags passed to `odb_has_object()`\n      builtin/fsck: fix flags passed to `odb_has_object()`\n      odb: drop gaps in object info flag values\n      odb: convert object info flags into an enum\n      odb: convert `odb_has_object()` flags into an enum\n      git-gui: fix use of GIT_CEILING_DIRECTORIES\n      git-gui: prefer shell at \"/bin/sh\" with Meson\n      git-gui: massage \"git-gui--askyesno\" with \"generate-script.sh\"\n      git-gui: wire up \"git-gui--askyesno\" with Meson\n      builtin/history: perform revwalk checks before asking for user input\n      builtin/history: check for merges before asking for user input\n      builtin/history: replace \"--ref-action=print\" with \"--dry-run\"\n      builtin/history: rename \"--ref-action=\" to \"--update-refs=\"\n      Documentation/git-history: document default for \"--update-refs=\"\n      commit: avoid parsing non-commits in `lookup_commit_reference_gently()`\n      commit: make `repo_parse_commit_no_graph()` more robust\n      commit: use commit graph in `lookup_commit_reference_gently()`\n      ci: handle failures of test-slice helper\n      ci: don't skip smallest test slice in GitLab\n      meson: fix MERGE_TOOL_DIR with \"--no-bin-wrappers\"\n      github: fix Meson tests not executing at all\n      ci: make test slicing consistent across Meson/Make\n      gitlab-ci: use \"run-test-slice-meson.sh\"\n      gitlab-ci: handle failed tests on MSVC+Meson job\n      pack-bitmap: deduplicate logic to iterate over preferred bitmap tips\n      pack-bitmap: fix bug with exact ref match in \"pack.preferBitmapTips\"\n      bisect: fix misuse of `refs_for_each_ref_in()`\n      t: don't set ICONV prereq when iconv(1) is missing\n      t40xx: don't use iconv(1) without ICONV prereq\n      t4205: improve handling of ICONV prerequisite\n      t5550: add ICONV prereq to tests that use \"$HTTPD_URL/error\"\n      t6006: don't use iconv(1) without ICONV prereq\n      t/helper: improve \"genrandom\" test helper\n      object-file: adapt `stream_object_signature()` to take a stream\n      packfile: expose function to read object stream for an offset\n      pack-check: fix verification of large objects\n      refs: remove unused `refs_for_each_include_root_ref()`\n      refs: move `refs_head_ref_namespaced()`\n      refs: move `do_for_each_ref_flags` further up\n      refs: rename `do_for_each_ref_flags`\n      refs: rename `each_ref_fn`\n      refs: introduce `refs_for_each_ref_ext`\n      refs: speed up `refs_for_each_glob_ref_in()`\n      refs: generalize `refs_for_each_namespaced_ref()`\n      refs: generalize `refs_for_each_fullref_in_prefixes()`\n      refs: improve verification for-each-ref options\n      refs: replace `refs_for_each_ref_in()`\n      refs: replace `refs_for_each_rawref()`\n      refs: replace `refs_for_each_rawref_in()`\n      refs: replace `refs_for_each_glob_ref_in()`\n      refs: replace `refs_for_each_glob_ref()`\n      refs: replace `refs_for_each_namespaced_ref()`\n      refs: replace `refs_for_each_fullref_in()`\n      t: fix races caused by background maintenance\n      t: disable maintenance where we verify object database structure\n      t34xx: don't expire reflogs where it matters\n      t5400: explicitly use \"gc\" strategy\n      t5510: explicitly use \"gc\" strategy\n      t6500: explicitly use \"gc\" strategy\n      t7900: prepare for switch of the default strategy\n      builtin/maintenance: use \"geometric\" strategy by default\n      ci: unset GITLAB_FEATURES envvar to not bust xargs(1) limits\n      add-patch: split out header from \"add-interactive.h\"\n      add-patch: split out `struct interactive_options`\n      add-patch: remove dependency on \"add-interactive\" subsystem\n      add-patch: add support for in-memory index patching\n      add-patch: allow disabling editing of hunks\n      cache-tree: allow writing in-memory index as tree\n      builtin/history: split out extended function to create commits\n      builtin/history: implement \"split\" subcommand\n      meson: simplify iconv-emits-BOM check\n      meson: detect broken iconv that requires ICONV_RESTART_RESET\n      gitlab-ci: update to macOS 15 images\n      odb: split `struct odb_source` into separate header\n      odb: introduce \"files\" source\n      odb: embed base source in the \"files\" backend\n      odb: move reparenting logic into respective subsystems\n      odb/source: introduce source type for robustness\n      odb/source: make `free()` function pluggable\n      odb/source: make `reprepare()` function pluggable\n      odb/source: make `close()` function pluggable\n      odb/source: make `read_object_info()` function pluggable\n      odb/source: make `read_object_stream()` function pluggable\n      odb/source: make `for_each_object()` function pluggable\n      odb/source: make `freshen_object()` function pluggable\n      odb/source: make `write_object()` function pluggable\n      odb/source: make `write_object_stream()` function pluggable\n      odb/source: make `read_alternates()` function pluggable\n      odb/source: make `write_alternate()` function pluggable\n      odb/source: make `begin_transaction()` function pluggable\n      editorconfig: fix style not applying to subdirs anymore\n      odb: stop including \"odb/source.h\"\n      packfile: extract logic to count number of objects\n      object-file: extract logic to approximate object count\n      object-file: generalize counting objects\n      odb/source: introduce generic object counting\n      odb: introduce generic object counting\n      upload-pack: fix debug statement when flushing packfile data\n      upload-pack: adapt keepalives based on buffering\n      upload-pack: prefer flushing data over sending keepalive\n      upload-pack: reduce lock contention when writing packfile data\n      compat/posix: introduce writev(3p) wrapper\n      wrapper: introduce writev(3p) wrappers\n      sideband: use writev(3p) to send pktlines\n      csum-file: introduce `hashfd_ext()`\n      csum-file: drop `hashfd_throughput()`\n      builtin/pack-objects: reduce lock contention when writing packfile data\n      clar: update to fix compilation on platforms without PATH_MAX\n      Introduce new \"tools/\" directory\n      contrib: move \"coccinelle/\" directory into \"tools/\"\n      contrib: move \"coverage-diff.sh\" script into \"tools/\"\n      contrib: move \"update-unicode.sh\" script into \"tools/\"\n      builds: move build scripts into \"tools/\"\n      git-compat-util.h: move warning infra to prepare for PCHs\n      meson: compile compatibility sources separately\n      meson: precompile \"git-compat-util.h\"\n      oidtree: modernize the code a bit\n      oidtree: extend iteration to allow for arbitrary return codes\n      odb: introduce `struct odb_for_each_object_options`\n      object-name: move logic to iterate through loose prefixed objects\n      object-name: move logic to iterate through packed prefixed objects\n      object-name: extract function to parse object ID prefixes\n      object-name: backend-generic `repo_collect_ambiguous()`\n      object-name: backend-generic `get_short_oid()`\n      object-name: merge `update_candidates()` and `match_prefix()`\n      object-name: abbreviate loose object names without `disambiguate_state`\n      object-name: simplify computing common prefixes\n      object-name: move logic to compute loose abbreviation length\n      object-file: move logic to compute packed abbreviation length\n      odb: introduce generic `odb_find_abbrev_len()`\n      fetch-pack: move fsck options into function scope\n      fsck: initialize fsck options via a function\n      fsck: store repository in fsck options\n      fsck: drop USE_THE_REPOSITORY\n      builtin/fsck: fix trivial dependence on `the_repository`\n      builtin/fsck: stop using `the_repository` when snapshotting refs\n      builtin/fsck: stop using `the_repository` when checking refs\n      builtin/fsck: stop using `the_repository` when checking reflogs\n      builtin/fsck: stop using `the_repository` with loose objects\n      builtin/fsck: stop using `the_repository` when checking packed objects\n      builtin/fsck: stop using `the_repository` when marking objects\n      builtin/fsck: stop using `the_repository` in error reporting\n      commit-graph: fix writing generations with dates exceeding 34 bits\n      CodingGuidelines: document our style for flags\n      treewide: use enum for `odb_for_each_object()` flags\n      odb: rename `odb_write_object()` flags\n      odb: use enum for `odb_write_object` flags\n      odb: rename `odb_has_object()` flags\n      odb: drop unneeded headers and forward decls\n      reftable: introduce \"reftable-system.h\" header\n      reftable/stack: provide fsync(3p) via system header\n      reftable/fsck: use REFTABLE_UNUSED instead of UNUSED\n      reftable/system: add abstraction to retrieve time in milliseconds\n      reftable/system: add abstraction to mmap files\n      t: work around multibyte bug in quoted heredocs with Dash v0.5.13\n      t9300: work around partial read bug in Dash v0.5.13\n\nPaul Tarjan (2):\n      t7527: fix flaky fsmonitor event tests with retry logic\n      fsmonitor-watchman: fix variable reference and remove redundant code\n\nPaulo Casaretto (1):\n      lockfile: add PID file for debugging stale locks\n\nPhil Hord (1):\n      .mailmap: fix email for Phil Hord\n\nPhillip Wood (13):\n      replay: drop commits that become empty\n      xdiff: remove \"line_hash\" field from xrecord_t\n      xdiff: remove unused data from xdlclass_t\n      meson: fix building mergetool docs\n      diff --anchored: avoid checking unmatched lines\n      templates: add .gitattributes entry for sample hooks\n      templates: detect commit messages containing diffs\n      wt-status: avoid passing NULL worktree\n      path: remove repository argument from worktree_git_path()\n      interpret-trailers: refactor create_in_place_tempfile()\n      worktree: remove \"the_repository\" from is_current_worktree()\n      worktree add: stop reading \".git/HEAD\"\n      worktree: reject NULL worktree in get_worktree_git_dir()\n\nPushkar Singh (3):\n      subtree: validate --prefix against commit in split\n      path: factor out skip_slashes() in normalize_path_copy_len()\n      archive: document --prefix handling of absolute and parent paths\n\nQuentin Bernet (1):\n      docs: fix \"git stash [push]\" documentation\n\nRamsay Jones (1):\n      object-file: fix sparse 'plain integer as NULL pointer' error\n\nRené Scharfe (12):\n      blame: fix coloring for repeated suspects\n      commit: use commit_stack\n      remove duplicate includes\n      version: stop using the_repository\n      xdiff-interface: stop using the_repository\n      pack-objects: remove duplicate --stdin-packs definition\n      parseopt: check for duplicate long names and numerical options\n      history: initialize rev_info in cmd_history_reword()\n      use commit_stack instead of prio_queue in LIFO mode\n      commit-reach: simplify cleanup of remaining bitmaps in ahead_behind ()\n      split-index: stop using the_repository and the_hash_algo\n      history: fix short help for argument of --update-refs\n\nRitesh Singh Jadoun (1):\n      t/pack-refs-tests: use test_path_is_missing\n\nRito Rhymes (5):\n      gitweb: add viewport meta tag for mobile devices\n      gitweb: prevent project search bar from overflowing on mobile\n      gitweb: fix mobile page overflow across log/commit/blob/diff views\n      gitweb: fix mobile footer overflow by wrapping text and clearing floats\n      gitweb: let page header grow on mobile for long wrapped project names\n\nRunxi Yu (1):\n      t5516: test updateInstead with worktree and unborn bare HEAD\n\nSahitya Chandra (1):\n      pack-redundant: fix memory leak when open_pack_index() fails\n\nSam Bostock (3):\n      worktree: clarify that --expire only affects missing worktrees\n      merge-ours: drop USE_THE_REPOSITORY_VARIABLE\n      merge-ours: integrate with sparse-index\n\nSamo Pogačnik (2):\n      shallow: free local object_array allocations\n      shallow: handling fetch relative-deepen\n\nScott Baker (2):\n      diff-highlight: drop perl version dependency back to 5.8\n      diff-highlight: allow module callers to pass in color config\n\nSeyi Kufoiji (2):\n      oidmap: make entry cleanup explicit in oidmap_clear\n      builtin/rev-list: migrate missing_objects cleanup to oidmap_clear_with_free()\n\nShannon Barber (1):\n      gitk: use config settings for head/tag colors\n\nShreyansh Paliwal (11):\n      doc: MyFirstContribution: fix missing dependencies and clarify build steps\n      t5500: simplify test implementation and fix git exit code suppression\n      show-index: warn when falling back to SHA-1 outside a repository\n      show-index: use gettext wrapping in user facing error messages\n      wt-status: pass struct repository through function parameters\n      wt-status: replace uses of the_repository with local repository instances\n      wt-status: use hash_algo from local repository instead of global the_hash_algo\n      tree-diff: remove the usage of the_hash_algo global\n      send-email: validate charset name in 8bit encoding prompt\n      add-patch: use repository instance from add_i_state instead of the_repository\n      doc: gitignore: clarify pattern base for info/exclude and core.excludesFile\n\nSiddharth Asthana (2):\n      sequencer: extract revert message formatting into shared function\n      replay: add --revert mode to reverse commit changes\n\nSiddharth Shrimali (8):\n      t: fix \"that that\" typo in lib-unicode-nfc-nfd.sh\n      t3700: avoid suppressing git's exit code\n      t3700: use test_grep helper for better diagnostics\n      t9123: use test_when_finished for cleanup\n      t3200: replace hardcoded null OID with $ZERO_OID\n      submodule--helper: replace malloc with xmalloc\n      t0410: modernize delete_object helper\n      t7004: replace wc -l with modern test helpers\n\nSoutrikDas (2):\n      doc: fix repo_config documentation reference\n      t7003: modernize path existence checks using test helpers\n\nTaylor Blau (22):\n      midx: mark `get_midx_checksum()` arguments as const\n      midx: rename `get_midx_checksum()` to `midx_get_checksum_hash()`\n      midx: introduce `midx_get_checksum_hex()`\n      builtin/multi-pack-index.c: make '--progress' a common option\n      git-multi-pack-index(1): remove non-existent incompatibility\n      git-multi-pack-index(1): align SYNOPSIS with 'git multi-pack-index -h'\n      t/t5319-multi-pack-index.sh: fix copy-and-paste error in t5319.39\n      midx-write.c: don't use `pack_perm` when assigning `bitmap_pos`\n      midx-write.c: introduce `struct write_midx_opts`\n      midx: do not require packs to be sorted in lexicographic order\n      midx-write.c: introduce `midx_pack_perm()` helper\n      midx-write.c: extract `fill_pack_from_midx()`\n      midx-write.c: enumerate `pack_int_id` values directly\n      midx-write.c: factor fanout layering from `compute_sorted_entries()`\n      t/helper/test-read-midx.c: plug memory leak when selecting layer\n      midx: implement MIDX compaction\n      midx: enable reachability bitmaps during MIDX compaction\n      pack-objects: plug leak in `read_stdin_packs()`\n      pack-objects: refactor `read_packs_list_from_stdin()` to use `strmap`\n      t7704: demonstrate failure with once-cruft objects above the geometric split\n      pack-objects: support excluded-open packs with --stdin-packs\n      repack: mark non-MIDX packs above the split as excluded-open\n\nTian Yuchen (7):\n      t/perf/p3400: speed up setup using fast-import\n      symlinks: use unsigned int for flags\n      setup: improve error diagnosis for invalid .git files\n      patch-ids: document intentional const-casting in patch_id_neq()\n      .mailmap: update email address for Tian Yuchen\n      diff: document -U without <n> as using default context\n      builtin/mktree: remove USE_THE_REPOSITORY_VARIABLE\n\nTodd Zullinger (1):\n      RelNotes: minor typo fixes in 2.54.0 draft\n\nToon Claes (13):\n      last-modified: clarify in the docs the command takes a pathspec\n      last-modified: document option '-z'\n      last-modified: document option '--max-depth'\n      last-modified: change default max-depth to 0\n      last-modified: rewrite error message when more than one commit given\n      last-modified: fix memory leak when more than one commit is given\n      last-modified: remove double error message\n      last-modified: verify revision argument is a commit-ish\n      cocci: extend MEMZERO_ARRAY() rules\n      replay: support replaying down from root commit\n      builtin/replay: mark options as not negatable\n      replay: use stuck form in documentation and help message\n      replay: allow to specify a ref with option --ref\n\nTrieu Huynh (4):\n      t8003: avoid suppressing git's exit code\n      t8003: modernise style\n      t6101: avoid suppressing git's exit code\n      backfill: auto-detect sparse-checkout from config\n\nUwe Kleine-König (1):\n      gpg-interface: signatures by expired keys are fine\n\nVaidas Pilkauskas (3):\n      strbuf: pass correct alloc to strbuf_attach() in strbuf_reencode()\n      strbuf_attach: fix call sites to pass correct alloc\n      http: add support for HTTP 429 rate limit retries\n\nWang Zichong (1):\n      gitk: support link color in the Preferences dialog\n\nWolfgang Faust (1):\n      git-gui: grey out comment lines in commit message\n\nYannik Tausch (1):\n      merge-file: honor merge.conflictStyle outside of a repository\n\nYee Cheng Chin (1):\n      xdiff: re-diff shifted change groups when using histogram algorithm\n\nYuvraj Singh Chauhan (1):\n      path-walk: fix NULL pointer dereference in error message\n\nZakariyah Ali (1):\n      t2000: modernise overall structure\n\nbrian m. carlson (17):\n      repository: require Rust support for interoperability\n      conversion: don't crash when no destination algo\n      hash: use uint32_t for object_id algorithm\n      rust: add a ObjectID struct\n      rust: add a hash algorithm abstraction\n      hash: add a function to look up hash algo structs\n      rust: add additional helpers for ObjectID\n      csum-file: define hashwrite's count as a uint32_t\n      write-or-die: add an fsync component for the object map\n      hash: expose hash context functions to Rust\n      rust: fix linking binaries with cargo\n      rust: add a build.rs script for tests\n      rust: add functionality to hash an object\n      rust: add a new binary object map format\n      rust: add a small wrapper around the hashfile code\n      object-file-convert: always make sure object ID algo is valid\n      docs: correct information about reftable\n\ncuiweixie (1):\n      fetch: fix wrong evaluation order in URL trailing-slash trimming\n\n"},{"id":"541696","messageId":"8c1def10-9039-aecd-4ce4-fb4676b47e9b@gmx.de","threadId":"65482","inReplyTo":"xmqqqzohd0sh.fsf@gitster.g","subject":"MIDX woes, was Re: [ANNOUNCE] Git v2.54.0-rc2","fromName":"Johannes Schindelin","fromEmail":"johannes.schindelin@gmx.de","sentAt":"2026-04-15T20:50:41Z","receivedAt":"2026-04-15T20:50:45Z","isPatch":false,"body":"Hi Junio,\n\nOn Tue, 14 Apr 2026, Junio C Hamano wrote:\n\n>  * Further work on incremental repacking using MIDX/bitmap\n\nI just noticed that a fetch with v2.54.0-rc2 into an existing repository\nrendered it unusable for Git v2.53.0:\n\n  fatal: multi-pack-index version 2 not recognized\n\nIs it possible that v2.54.0-rc2 forcefully uses a MIDX version that has\n_just_ been introduced?\n\nIf so, that might have been a premature bump of the default MIDX version,\nif even the preceding Git version fails to handle that MIDX version. It is\nguaranteed to cause substantial problems in setups where e.g. libgit2 or\nJGit is expected to be used interchangeably with Git. It also causes\nproblems when users have to downgrade Git, or use several Git versions\nside by side (e.g. using GitHub Desktop, which bundles its own version of\nGit).\n\nCiao,\nJohannes\n"},{"id":"541697","messageId":"xmqq5x5s540j.fsf@gitster.g","threadId":"65482","inReplyTo":"8c1def10-9039-aecd-4ce4-fb4676b47e9b@gmx.de","subject":"Re: MIDX woes, was Re: [ANNOUNCE] Git v2.54.0-rc2","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2026-04-15T21:04:44Z","receivedAt":"2026-04-15T21:04:47Z","isPatch":false,"body":"Johannes Schindelin <Johannes.Schindelin@gmx.de> writes:\n\n>>  * Further work on incremental repacking using MIDX/bitmap\n>\n> I just noticed that a fetch with v2.54.0-rc2 into an existing repository\n> rendered it unusable for Git v2.53.0:\n>\n>   fatal: multi-pack-index version 2 not recognized\n>\n> Is it possible that v2.54.0-rc2 forcefully uses a MIDX version that has\n> _just_ been introduced?\n>\n> If so, that might have been a premature bump of the default MIDX version,\n> if even the preceding Git version fails to handle that MIDX version. It is\n> guaranteed to cause substantial problems in setups where e.g. libgit2 or\n> JGit is expected to be used interchangeably with Git. It also causes\n> problems when users have to downgrade Git, or use several Git versions\n> side by side (e.g. using GitHub Desktop, which bundles its own version of\n> Git).\n\nIs b2ec8e90 (midx: do not require packs to be sorted in\nlexicographic order, 2026-02-24), which says\n\n    This change produces MIDXs which may not be correctly read with external\n    tools or older versions of Git. Though older versions of Git know how to\n    gracefully degrade and ignore any MIDX(s) they consider corrupt,\n    external tools may not be as robust. To avoid unintentionally breaking\n    any such tools, guard this change behind a version bump in the MIDX's\n    on-disk format.\n    \nrelevant?  The version bump seems to be doing more harm to \"older\nversions of Git\" that \"know how to gracefully degrade\" by not\nallowing them to degrade.\n\nTaylor, perhaps you would want to add some instructions on how to\nrecover?  Like \"rm -f .git/objects/pack/*.midx\" or something?\n\nThanks, all.\n"},{"id":"541710","messageId":"20260416051732.GA48541@coredump.intra.peff.net","threadId":"65482","inReplyTo":"xmqq5x5s540j.fsf@gitster.g","subject":"Re: MIDX woes, was Re: [ANNOUNCE] Git v2.54.0-rc2","fromName":"Jeff King","fromEmail":"peff@peff.net","sentAt":"2026-04-16T05:17:32Z","receivedAt":"2026-04-16T05:17:44Z","isPatch":false,"body":"On Wed, Apr 15, 2026 at 02:04:44PM -0700, Junio C Hamano wrote:\n\n> Johannes Schindelin <Johannes.Schindelin@gmx.de> writes:\n> \n> >>  * Further work on incremental repacking using MIDX/bitmap\n> >\n> > I just noticed that a fetch with v2.54.0-rc2 into an existing repository\n> > rendered it unusable for Git v2.53.0:\n> >\n> >   fatal: multi-pack-index version 2 not recognized\n> >\n> > Is it possible that v2.54.0-rc2 forcefully uses a MIDX version that has\n> > _just_ been introduced?\n> >\n> > If so, that might have been a premature bump of the default MIDX version,\n> > if even the preceding Git version fails to handle that MIDX version. It is\n> > guaranteed to cause substantial problems in setups where e.g. libgit2 or\n> > JGit is expected to be used interchangeably with Git. It also causes\n> > problems when users have to downgrade Git, or use several Git versions\n> > side by side (e.g. using GitHub Desktop, which bundles its own version of\n> > Git).\n> \n> Is b2ec8e90 (midx: do not require packs to be sorted in\n> lexicographic order, 2026-02-24), which says\n> \n>     This change produces MIDXs which may not be correctly read with external\n>     tools or older versions of Git. Though older versions of Git know how to\n>     gracefully degrade and ignore any MIDX(s) they consider corrupt,\n>     external tools may not be as robust. To avoid unintentionally breaking\n>     any such tools, guard this change behind a version bump in the MIDX's\n>     on-disk format.\n>     \n> relevant?  The version bump seems to be doing more harm to \"older\n> versions of Git\" that \"know how to gracefully degrade\" by not\n> allowing them to degrade.\n\nEek. The midx _should_ be an optional component, so returning an error\nduring load would then just look in the regular pack .idx files. But\nthere are a few die() calls in the loading function. :(\n\nSomething like the patch below on top of v2.53.0 gets the desired effect\n(we print \"version 2 not recognized to stderr\" and then everything works\nanyway). But of course we can't go back in time now to fix it (and\nearlier versions).\n\nI wonder how libgit2 and JGit handle this:\n\n  - Looking in the source, JGit will throw an exception, which is\n    presumably caught and handled OK (at least seems to using the \"jgit\"\n    CLI I have handy). So that's good.\n\n  - libgit2 seems to \"return midx_error()\" if the signature or version\n    isn't matched. I don't have an easy tool built against it, but\n    looking at the code I think it would quietly fall back to using the\n    actual packs.\n\nSo it really is just our old versions that are the problem.\n\nI think removing the .midx file (and optionally regenerating with the\nold version) would be the appropriate workaround, but I wonder how hard\nit would be to go back to generating v1 midx files by default. I know v2\nis a building block for more advanced features, but for those who are\nnot using those features yet it is a strict regression.\n\n-Peff\n\n---\ndiff --git a/midx.c b/midx.c\nindex a75ea99a0d..79ce6a1e3b 100644\n--- a/midx.c\n+++ b/midx.c\n@@ -134,22 +134,26 @@ static struct multi_pack_index *load_multi_pack_index_one(struct odb_source *sou\n \n \tCALLOC_ARRAY(m, 1);\n \tm->data = midx_map;\n \tm->data_len = midx_size;\n \tm->source = source;\n \n \tm->signature = get_be32(m->data);\n-\tif (m->signature != MIDX_SIGNATURE)\n-\t\tdie(_(\"multi-pack-index signature 0x%08x does not match signature 0x%08x\"),\n+\tif (m->signature != MIDX_SIGNATURE) {\n+\t\terror(_(\"multi-pack-index signature 0x%08x does not match signature 0x%08x\"),\n \t\t      m->signature, MIDX_SIGNATURE);\n+\t\tgoto cleanup_fail;\n+\t}\n \n \tm->version = m->data[MIDX_BYTE_FILE_VERSION];\n-\tif (m->version != MIDX_VERSION)\n-\t\tdie(_(\"multi-pack-index version %d not recognized\"),\n+\tif (m->version != MIDX_VERSION) {\n+\t\terror(_(\"multi-pack-index version %d not recognized\"),\n \t\t      m->version);\n+\t\tgoto cleanup_fail;\n+\t}\n \n \thash_version = m->data[MIDX_BYTE_HASH_VERSION];\n \tif (hash_version != oid_version(r->hash_algo)) {\n \t\terror(_(\"multi-pack-index hash version %u does not match version %u\"),\n \t\t      hash_version, oid_version(r->hash_algo));\n \t\tgoto cleanup_fail;\n \t}\n"},{"id":"541711","messageId":"20260416053435.GA646718@coredump.intra.peff.net","threadId":"65482","inReplyTo":"20260416051732.GA48541@coredump.intra.peff.net","subject":"Re: MIDX woes, was Re: [ANNOUNCE] Git v2.54.0-rc2","fromName":"Jeff King","fromEmail":"peff@peff.net","sentAt":"2026-04-16T05:34:35Z","receivedAt":"2026-04-16T05:34:37Z","isPatch":false,"body":"On Thu, Apr 16, 2026 at 01:17:33AM -0400, Jeff King wrote:\n\n> I think removing the .midx file (and optionally regenerating with the\n> old version) would be the appropriate workaround, but I wonder how hard\n> it would be to go back to generating v1 midx files by default. I know v2\n> is a building block for more advanced features, but for those who are\n> not using those features yet it is a strict regression.\n\nI think doing so is just this one-liner:\n\ndiff --git a/midx-write.c b/midx-write.c\nindex 0ff2e45aa7..607de889f9 100644\n--- a/midx-write.c\n+++ b/midx-write.c\n@@ -1259,7 +1259,7 @@ static int write_midx_internal(struct write_midx_opts *opts)\n \tstruct tempfile *incr;\n \tstruct write_midx_context ctx = {\n \t\t.preferred_pack_idx = NO_PREFERRED_PACK,\n-\t\t.version = MIDX_VERSION_V2,\n+\t\t.version = MIDX_VERSION_V1,\n \t };\n \tstruct multi_pack_index *midx_to_free = NULL;\n \tint bitmapped_packs_concat_len = 0;\n\nand there is already a midx.version config option to override it. But we\nalso need to touch the tests a bit. Here we just tweak the expectation\nfor some low-level examination of the files:\n\ndiff --git a/t/t5319-multi-pack-index.sh b/t/t5319-multi-pack-index.sh\nindex 58e0b685b1..ed1f993a74 100755\n--- a/t/t5319-multi-pack-index.sh\n+++ b/t/t5319-multi-pack-index.sh\n@@ -19,9 +19,12 @@ midx_read_expect () {\n \tNUM_CHUNKS=$3\n \tOBJECT_DIR=$4\n \tEXTRA_CHUNKS=\"$5\"\n+\t# This reflects the default midx version we write; it should switch\n+\t# to 2 if we flip the default.\n+\tVERSION=1\n \t{\n \t\tcat <<-EOF &&\n-\t\theader: 4d494458 2 $HASH_LEN $NUM_CHUNKS $NUM_PACKS\n+\t\theader: 4d494458 $VERSION $HASH_LEN $NUM_CHUNKS $NUM_PACKS\n \t\tchunks: pack-names oid-fanout oid-lookup object-offsets$EXTRA_CHUNKS\n \t\tnum_objects: $NUM_OBJECTS\n \t\tpacks:\n\nand then here we need to use v2 for the new compaction feature:\n\ndiff --git a/t/t5335-compact-multi-pack-index.sh b/t/t5335-compact-multi-pack-index.sh\nindex 40f3844282..4ad007169a 100755\n--- a/t/t5335-compact-multi-pack-index.sh\n+++ b/t/t5335-compact-multi-pack-index.sh\n@@ -57,6 +57,13 @@ test_midx_layer_object_uniqueness () {\n \tdone <$midx_chain\n }\n \n+# MIDX compaction requires the v2 format, so make it the default\n+# for the rest of this script. We check below that trying\n+# compaction with v1 fails using \"git -c\", which will override this.\n+test_expect_success 'set midx version config' '\n+\tgit config --global midx.version 2\n+'\n+\n test_expect_success 'MIDX compaction with lex-ordered pack names' '\n \tgit init midx-compact-lex-order &&\n \t(\n\nSo that would make things work as usual for anybody mixing and matching\nmultiple versions of Git, but does make life slightly worse for anybody\nwho wants to use the new feature (they have to set the config). We might\nneed a doc update, or possibly even to automatically default to v2 when\nusing the compact command. But that could come post-2.54.\n\nAt this point I'll stop poking and speculating and see what direction\nTaylor suggests. ;)\n\n-Peff\n"},{"id":"541735","messageId":"621c9da9-2ec0-462d-ae51-0be5e0ca6ab2@gmail.com","threadId":"65482","inReplyTo":"20260416053435.GA646718@coredump.intra.peff.net","subject":"Re: MIDX woes, was Re: [ANNOUNCE] Git v2.54.0-rc2","fromName":"Derrick Stolee","fromEmail":"stolee@gmail.com","sentAt":"2026-04-16T13:24:31Z","receivedAt":"2026-04-16T13:24:34Z","isPatch":false,"body":"On 4/16/2026 1:34 AM, Jeff King wrote:\n> On Thu, Apr 16, 2026 at 01:17:33AM -0400, Jeff King wrote:\n> \n>> I think removing the .midx file (and optionally regenerating with the\n>> old version) would be the appropriate workaround, but I wonder how hard\n>> it would be to go back to generating v1 midx files by default. I know v2\n>> is a building block for more advanced features, but for those who are\n>> not using those features yet it is a strict regression.\n> \n> I think doing so is just this one-liner:\n...\n> and then here we need to use v2 for the new compaction feature:\n...\n> So that would make things work as usual for anybody mixing and matching\n> multiple versions of Git, but does make life slightly worse for anybody\n> who wants to use the new feature (they have to set the config). We might\n> need a doc update, or possibly even to automatically default to v2 when\n> using the compact command. But that could come post-2.54.\n> \n> At this point I'll stop poking and speculating and see what direction\n> Taylor suggests. ;)\n\nI think this is a good change to make. This fits with the standard\napproach of not making breaking file changes by default, but letting\nusers opt-in to new versions (at least for a few major releases).\n\nThe part that is striking about Johannes' report is that this happens\non a fetch, so it is being written automatically by normal maintenance\nactivities in that case. Without downgrading the default version back\nto a compatible version, deleting the multi-pack-index(es) will not\nkeep the repo in a good state.\n\nAs for the multi-pack-index being optional, I agree that we _could_\nhave a more graceful fallback to the pack-indexes when we don't\nrecognize the file format version. This should still be a very visible\nwarning as it can be an important performance feature, so users should\nbe notified when it isn't working as they expect. (This can be done\nseparately from this late-in-rc change for the default version.)\n\nThanks,\n-Stolee\n\n"},{"id":"541749","messageId":"xmqqik9q3n15.fsf@gitster.g","threadId":"65482","inReplyTo":"621c9da9-2ec0-462d-ae51-0be5e0ca6ab2@gmail.com","subject":"Re: MIDX woes, was Re: [ANNOUNCE] Git v2.54.0-rc2","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2026-04-16T16:09:10Z","receivedAt":"2026-04-16T16:09:12Z","isPatch":false,"body":"Derrick Stolee <stolee@gmail.com> writes:\n\n>> I think doing so is just this one-liner:\n> ...\n>> and then here we need to use v2 for the new compaction feature:\n> ...\n> I think this is a good change to make. This fits with the standard\n> approach of not making breaking file changes by default, but letting\n> users opt-in to new versions (at least for a few major releases).\n\nYes.\n\nIs anybody volunteering to put the patches together?\n\n> The part that is striking about Johannes' report is that this happens\n> on a fetch, so it is being written automatically by normal maintenance\n> activities in that case. Without downgrading the default version back\n> to a compatible version, deleting the multi-pack-index(es) will not\n> keep the repo in a good state.\n\nI am not sure what you mean by \"deleting will not keep the\nrepository in a good state\".  Isn't multi-pack-index totall\noptional?\n\n> As for the multi-pack-index being optional, I agree that we _could_\n> have a more graceful fallback to the pack-indexes when we don't\n> recognize the file format version. This should still be a very visible\n> warning as it can be an important performance feature, so users should\n> be notified when it isn't working as they expect. (This can be done\n> separately from this late-in-rc change for the default version.)\n\nTrue.\n\nThanks.\n"},{"id":"541761","messageId":"xmqqldem22uw.fsf@gitster.g","threadId":"65482","inReplyTo":"20260416053435.GA646718@coredump.intra.peff.net","subject":"Re: MIDX woes, was Re: [ANNOUNCE] Git v2.54.0-rc2","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2026-04-16T18:10:15Z","receivedAt":"2026-04-16T18:10:18Z","isPatch":false,"body":"Jeff King <peff@peff.net> writes:\n\n> On Thu, Apr 16, 2026 at 01:17:33AM -0400, Jeff King wrote:\n>\n>> I think removing the .midx file (and optionally regenerating with the\n>> old version) would be the appropriate workaround, but I wonder how hard\n>> it would be to go back to generating v1 midx files by default. I know v2\n>> is a building block for more advanced features, but for those who are\n>> not using those features yet it is a strict regression.\n>\n> I think doing so is just this one-liner:\n\nLet's do this before Git 2.54 final, then.\n\n----- >8 -----\nFrom: Jeff King <peff@peff.net>\nDate: Thu, 16 Apr 2026 10:56:20 -0700\nSubject: [PATCH] MIDX: keep the default version to MIDX v1\n\nAs deployed versions of Git and its reimplementations may not be\nready for the format bump, let's revert the default version of MIDX\nfile we write back to V1, and adjust the tests so that the ones that\ndo test features that require V2 to explicitly ask for it.\n\nSigned-off-by: Junio C Hamano <gitster@pobox.com>\n---\n midx-write.c                        | 2 +-\n t/t5319-multi-pack-index.sh         | 5 ++++-\n t/t5335-compact-multi-pack-index.sh | 7 +++++++\n 3 files changed, 12 insertions(+), 2 deletions(-)\n\ndiff --git a/midx-write.c b/midx-write.c\nindex 0ff2e45aa7..607de889f9 100644\n--- a/midx-write.c\n+++ b/midx-write.c\n@@ -1259,7 +1259,7 @@ static int write_midx_internal(struct write_midx_opts *opts)\n \tstruct tempfile *incr;\n \tstruct write_midx_context ctx = {\n \t\t.preferred_pack_idx = NO_PREFERRED_PACK,\n-\t\t.version = MIDX_VERSION_V2,\n+\t\t.version = MIDX_VERSION_V1,\n \t };\n \tstruct multi_pack_index *midx_to_free = NULL;\n \tint bitmapped_packs_concat_len = 0;\ndiff --git a/t/t5319-multi-pack-index.sh b/t/t5319-multi-pack-index.sh\nindex 58e0b685b1..ed1f993a74 100755\n--- a/t/t5319-multi-pack-index.sh\n+++ b/t/t5319-multi-pack-index.sh\n@@ -19,9 +19,12 @@ midx_read_expect () {\n \tNUM_CHUNKS=$3\n \tOBJECT_DIR=$4\n \tEXTRA_CHUNKS=\"$5\"\n+\t# This reflects the default midx version we write; it should switch\n+\t# to 2 if we flip the default.\n+\tVERSION=1\n \t{\n \t\tcat <<-EOF &&\n-\t\theader: 4d494458 2 $HASH_LEN $NUM_CHUNKS $NUM_PACKS\n+\t\theader: 4d494458 $VERSION $HASH_LEN $NUM_CHUNKS $NUM_PACKS\n \t\tchunks: pack-names oid-fanout oid-lookup object-offsets$EXTRA_CHUNKS\n \t\tnum_objects: $NUM_OBJECTS\n \t\tpacks:\ndiff --git a/t/t5335-compact-multi-pack-index.sh b/t/t5335-compact-multi-pack-index.sh\nindex 40f3844282..4ad007169a 100755\n--- a/t/t5335-compact-multi-pack-index.sh\n+++ b/t/t5335-compact-multi-pack-index.sh\n@@ -57,6 +57,13 @@ test_midx_layer_object_uniqueness () {\n \tdone <$midx_chain\n }\n \n+# MIDX compaction requires the v2 format, so make it the default\n+# for the rest of this script. We check below that trying\n+# compaction with v1 fails using \"git -c\", which will override this.\n+test_expect_success 'set midx version config' '\n+\tgit config --global midx.version 2\n+'\n+\n test_expect_success 'MIDX compaction with lex-ordered pack names' '\n \tgit init midx-compact-lex-order &&\n \t(\n-- \n2.54.0-rc2-109-g879cd67f0d\n\n"},{"id":"541762","messageId":"xmqqh5pa22h0.fsf@gitster.g","threadId":"65482","inReplyTo":"xmqqldem22uw.fsf@gitster.g","subject":"Re: MIDX woes, was Re: [ANNOUNCE] Git v2.54.0-rc2","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2026-04-16T18:18:35Z","receivedAt":"2026-04-16T18:18:37Z","isPatch":false,"body":"Junio C Hamano <gitster@pobox.com> writes:\n\n> Jeff King <peff@peff.net> writes:\n>\n>> On Thu, Apr 16, 2026 at 01:17:33AM -0400, Jeff King wrote:\n>>\n>>> I think removing the .midx file (and optionally regenerating with the\n>>> old version) would be the appropriate workaround, but I wonder how hard\n>>> it would be to go back to generating v1 midx files by default. I know v2\n>>> is a building block for more advanced features, but for those who are\n>>> not using those features yet it is a strict regression.\n>>\n>> I think doing so is just this one-liner:\n>\n> Let's do this before Git 2.54 final, then.\n\nAs to the other change, rebased to our current codebase, we could\nsell it as \"futureproofing\" for similar breakages we make next, but\nthat means we are promising ourselves that we will forever keep the\nMIDX purely optional feature.  I do not think we want to decide that\nwe are comfortable with that position during -rc period, so I am not\nsure.  These error() messages should be reworded to make it clear\nthat we are _ignoring_ the corrupt multi-pack-prefix file(s) as a\nresult, and then further weakened into warning(), I think, if we\nwere to go in that direction.\n\n midx.c | 10 +++++++---\n 1 file changed, 7 insertions(+), 3 deletions(-)\n\ndiff --git c/midx.c w/midx.c\nindex 81d6ab11e6..06535ffd46 100644\n--- c/midx.c\n+++ w/midx.c\n@@ -145,14 +145,18 @@ static struct multi_pack_index *load_multi_pack_index_one(struct odb_source *sou\n \tm->source = source;\n \n \tm->signature = get_be32(m->data);\n-\tif (m->signature != MIDX_SIGNATURE)\n-\t\tdie(_(\"multi-pack-index signature 0x%08x does not match signature 0x%08x\"),\n+\tif (m->signature != MIDX_SIGNATURE) {\n+\t\terror(_(\"multi-pack-index signature 0x%08x does not match signature 0x%08x\"),\n \t\t      m->signature, MIDX_SIGNATURE);\n+\t\tgoto cleanup_fail;\n+\t}\n \n \tm->version = m->data[MIDX_BYTE_FILE_VERSION];\n \tif (m->version != MIDX_VERSION_V1 && m->version != MIDX_VERSION_V2)\n-\t\tdie(_(\"multi-pack-index version %d not recognized\"),\n+\t\terror(_(\"multi-pack-index version %d not recognized\"),\n \t\t      m->version);\n+\t\tgoto cleanup_fail;\n+\t}\n \n \thash_version = m->data[MIDX_BYTE_HASH_VERSION];\n \tif (hash_version != oid_version(r->hash_algo)) {\n"},{"id":"541764","messageId":"xmqq8qam217m.fsf_-_@gitster.g","threadId":"65482","inReplyTo":"xmqqldem22uw.fsf@gitster.g","subject":"[PATCH] MIDX: revert the default version to v1","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2026-04-16T18:45:49Z","receivedAt":"2026-04-16T18:45:52Z","isPatch":true,"body":"From: Jeff King <peff@peff.net>\n\nDscho reports that fetching into a repository with Git 2.54-rc2 made\nit unusable with Git 2.53, as the recent code by default writes\nversion 2 multi-pack-index files.  Version 2 is the base of more\nadvanced features to come, but using it where these features are not\nused is a strict regression.\n\nAs deployed versions of Git and its reimplementations may not be\nready for the format bump, let's revert the default version of MIDX\nfile we write back to V1, and adjust tests that exercise V2-specific\nfeatures to explicitly request V2.\n\nSigned-off-by: Junio C Hamano <gitster@pobox.com>\n---\n\n * Let me reword the proposed log message to talk about background a\n   bit more why we want to do this.\n\n midx-write.c                        | 2 +-\n t/t5319-multi-pack-index.sh         | 5 ++++-\n t/t5335-compact-multi-pack-index.sh | 7 +++++++\n 3 files changed, 12 insertions(+), 2 deletions(-)\n\ndiff --git a/midx-write.c b/midx-write.c\nindex 0ff2e45aa7..607de889f9 100644\n--- a/midx-write.c\n+++ b/midx-write.c\n@@ -1259,7 +1259,7 @@ static int write_midx_internal(struct write_midx_opts *opts)\n \tstruct tempfile *incr;\n \tstruct write_midx_context ctx = {\n \t\t.preferred_pack_idx = NO_PREFERRED_PACK,\n-\t\t.version = MIDX_VERSION_V2,\n+\t\t.version = MIDX_VERSION_V1,\n \t };\n \tstruct multi_pack_index *midx_to_free = NULL;\n \tint bitmapped_packs_concat_len = 0;\ndiff --git a/t/t5319-multi-pack-index.sh b/t/t5319-multi-pack-index.sh\nindex 58e0b685b1..ed1f993a74 100755\n--- a/t/t5319-multi-pack-index.sh\n+++ b/t/t5319-multi-pack-index.sh\n@@ -19,9 +19,12 @@ midx_read_expect () {\n \tNUM_CHUNKS=$3\n \tOBJECT_DIR=$4\n \tEXTRA_CHUNKS=\"$5\"\n+\t# This reflects the default midx version we write; it should switch\n+\t# to 2 if we flip the default.\n+\tVERSION=1\n \t{\n \t\tcat <<-EOF &&\n-\t\theader: 4d494458 2 $HASH_LEN $NUM_CHUNKS $NUM_PACKS\n+\t\theader: 4d494458 $VERSION $HASH_LEN $NUM_CHUNKS $NUM_PACKS\n \t\tchunks: pack-names oid-fanout oid-lookup object-offsets$EXTRA_CHUNKS\n \t\tnum_objects: $NUM_OBJECTS\n \t\tpacks:\ndiff --git a/t/t5335-compact-multi-pack-index.sh b/t/t5335-compact-multi-pack-index.sh\nindex 40f3844282..4ad007169a 100755\n--- a/t/t5335-compact-multi-pack-index.sh\n+++ b/t/t5335-compact-multi-pack-index.sh\n@@ -57,6 +57,13 @@ test_midx_layer_object_uniqueness () {\n \tdone <$midx_chain\n }\n \n+# MIDX compaction requires the v2 format, so make it the default\n+# for the rest of this script. We check below that trying\n+# compaction with v1 fails using \"git -c\", which will override this.\n+test_expect_success 'set midx version config' '\n+\tgit config --global midx.version 2\n+'\n+\n test_expect_success 'MIDX compaction with lex-ordered pack names' '\n \tgit init midx-compact-lex-order &&\n \t(\n-- \n2.54.0-rc2-109-g879cd67f0d\n\n"},{"id":"541766","messageId":"xmqqv7dqzoeh.fsf@gitster.g","threadId":"65482","inReplyTo":"xmqq8qam217m.fsf_-_@gitster.g","subject":"Re: [PATCH] MIDX: revert the default version to v1","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2026-04-16T19:38:30Z","receivedAt":"2026-04-16T19:38:33Z","isPatch":true,"body":"Junio C Hamano <gitster@pobox.com> writes:\n\n> From: Jeff King <peff@peff.net>\n>\n> Dscho reports that fetching into a repository with Git 2.54-rc2 made\n> it unusable with Git 2.53, as the recent code by default writes\n> version 2 multi-pack-index files.  Version 2 is the base of more\n> advanced features to come, but using it where these features are not\n> used is a strict regression.\n>\n> As deployed versions of Git and its reimplementations may not be\n> ready for the format bump, let's revert the default version of MIDX\n> file we write back to V1, and adjust tests that exercise V2-specific\n> features to explicitly request V2.\n>\n> Signed-off-by: Junio C Hamano <gitster@pobox.com>\n> ---\n>\n>  * Let me reword the proposed log message to talk about background a\n>    bit more why we want to do this.\n\nOf course, the tip of tb/incremental-midx-part-3.3 needs to be\nadjusted with this before merging to 'seen'.  I think my tree is\ngetting ready to push the \"revert the default\" down to 'master'.\n\n----- >8 ----\nSQUASH??? adjust for MIDX version default reversion\n\ndiff --git a/t/t7705-repack-incremental-midx.sh b/t/t7705-repack-incremental-midx.sh\nindex 562554e69b..7eb1109ec5 100755\n--- a/t/t7705-repack-incremental-midx.sh\n+++ b/t/t7705-repack-incremental-midx.sh\n@@ -63,6 +63,9 @@ create_layers () {\n \tdone\n }\n \n+# These incremental MIDX tests requires the V2 format.\n+git config --global midx.version 2\n+\n test_expect_success '--write-midx=incremental without --geometric' '\n \tgit init incremental-without-geometric &&\n \t(\n"},{"id":"541767","messageId":"20260416194922.GA1887222@coredump.intra.peff.net","threadId":"65482","inReplyTo":"xmqqh5pa22h0.fsf@gitster.g","subject":"Re: MIDX woes, was Re: [ANNOUNCE] Git v2.54.0-rc2","fromName":"Jeff King","fromEmail":"peff@peff.net","sentAt":"2026-04-16T19:49:22Z","receivedAt":"2026-04-16T19:49:28Z","isPatch":false,"body":"On Thu, Apr 16, 2026 at 11:18:35AM -0700, Junio C Hamano wrote:\n\n> As to the other change, rebased to our current codebase, we could\n> sell it as \"futureproofing\" for similar breakages we make next, but\n> that means we are promising ourselves that we will forever keep the\n> MIDX purely optional feature.  I do not think we want to decide that\n> we are comfortable with that position during -rc period, so I am not\n> sure.  These error() messages should be reworded to make it clear\n> that we are _ignoring_ the corrupt multi-pack-prefix file(s) as a\n> result, and then further weakened into warning(), I think, if we\n> were to go in that direction.\n\nYeah, I agree that re-wording would be a good idea here. I think this\ncan happen post-release. We'd like for this to have happened long ago,\nbut it didn't. Doing it in 2.54 versus 2.55 does not really matter, as:\n\n  1. We still have to worry about 2.53 and earlier anyway, so one\n     version is not much in the grand scheme of things.\n\n  2. For midx v2, 2.54 knows how to read it anyway, so is not affected\n     by the problem. ;)\n\n-Peff\n"},{"id":"541768","messageId":"20260416200659.GB1887222@coredump.intra.peff.net","threadId":"65482","inReplyTo":"xmqq8qam217m.fsf_-_@gitster.g","subject":"Re: [PATCH] MIDX: revert the default version to v1","fromName":"Jeff King","fromEmail":"peff@peff.net","sentAt":"2026-04-16T20:06:59Z","receivedAt":"2026-04-16T20:07:03Z","isPatch":true,"body":"On Thu, Apr 16, 2026 at 11:45:49AM -0700, Junio C Hamano wrote:\n\n> From: Jeff King <peff@peff.net>\n> \n> Dscho reports that fetching into a repository with Git 2.54-rc2 made\n> it unusable with Git 2.53, as the recent code by default writes\n> version 2 multi-pack-index files.  Version 2 is the base of more\n> advanced features to come, but using it where these features are not\n> used is a strict regression.\n> \n> As deployed versions of Git and its reimplementations may not be\n> ready for the format bump, let's revert the default version of MIDX\n> file we write back to V1, and adjust tests that exercise V2-specific\n> features to explicitly request V2.\n> \n> Signed-off-by: Junio C Hamano <gitster@pobox.com>\n\nThis looks fine to me, and you can add my S-o-b if you want. But let me\npropose a slight alternative that reduces the test churn and may make\nthings easier going forward.\n\n-- >8 --\nSubject: [PATCH] MIDX: revert the default version to v1\n\nWe introduced midx version 2 in b2ec8e90c2 (midx: do not require packs\nto be sorted in lexicographic order, 2026-02-24) and now write it by\ndefault. The rationale was that older versions should ignore the v2 midx\nand fall back to using the packs (just like we do for other midx\nerrors). Unfortunately this is not the case, as we have a hard die()\nwhen we see an unknown midx version.\n\nAs a result, writing a midx with Git 2.54-rc2 puts the repository into a\nstate that is unusable with Git 2.53. And this midx write may happen\nbehind the scenes as part of normal operations, like fetch.\n\nLet's switch back to writing v1 by default to avoid regressing the case\nwhere multiple versions of Git are used on the same repository.\n\nThere is one gotcha, though: the v2 format is required for some new\nfeatures, like midx compaction, and running \"git multi-pack-index\ncompact\" will complain when asked to write a v1 index. The user must set\nmidx.version to \"2\" to make the feature work.\n\nSo instead of always using v1, we'll base the default on whether the\nrequested feature requires v2. That does mean that running midx\ncompaction will create a repository that can't be read by older versions\nof Git. But we never do that by default; only people experimenting with\nthe new feature will be affected.\n\nWe have to adjust the test expectation in t5319, since it will now\ngenerate v1 files. And our \"auto-select v2\" is covered by the tests in\nt5335, which continue to check that compaction works without having to\nset midx.version manually (and also explicitly check that asking for v1\nwith compaction reports the problem).\n\nSigned-off-by: Jeff King <peff@peff.net>\n---\nI have a feeling there are probably some gaps in v2 testing in t5319,\nsince we are no longer using v2 for the bulk of the tests. IMHO that is\nOK to sort out post-release.\n\n Documentation/git-multi-pack-index.adoc | 3 +++\n midx-write.c                            | 4 +++-\n t/t5319-multi-pack-index.sh             | 2 +-\n 3 files changed, 7 insertions(+), 2 deletions(-)\n\ndiff --git a/Documentation/git-multi-pack-index.adoc b/Documentation/git-multi-pack-index.adoc\nindex 6125683014..3a5aa22778 100644\n--- a/Documentation/git-multi-pack-index.adoc\n+++ b/Documentation/git-multi-pack-index.adoc\n@@ -98,6 +98,9 @@ compact::\n \t--[no-]bitmap::\n \t\tControl whether or not a multi-pack bitmap is written.\n --\n++\n+Note that the compact command requires writing a version-2 midx that\n+cannot be read by versions of Git prior to v2.54.\n \n verify::\n \tVerify the contents of the MIDX file.\ndiff --git a/midx-write.c b/midx-write.c\nindex 0ff2e45aa7..a89ac53045 100644\n--- a/midx-write.c\n+++ b/midx-write.c\n@@ -1259,7 +1259,6 @@ static int write_midx_internal(struct write_midx_opts *opts)\n \tstruct tempfile *incr;\n \tstruct write_midx_context ctx = {\n \t\t.preferred_pack_idx = NO_PREFERRED_PACK,\n-\t\t.version = MIDX_VERSION_V2,\n \t };\n \tstruct multi_pack_index *midx_to_free = NULL;\n \tint bitmapped_packs_concat_len = 0;\n@@ -1275,6 +1274,9 @@ static int write_midx_internal(struct write_midx_opts *opts)\n \tctx.repo = r;\n \tctx.source = opts->source;\n \n+\tctx.version = opts->flags & MIDX_WRITE_COMPACT ?\n+\t\tMIDX_VERSION_V2 :\n+\t\tMIDX_VERSION_V1;\n \trepo_config_get_int(ctx.repo, \"midx.version\", &ctx.version);\n \tif (ctx.version != MIDX_VERSION_V1 && ctx.version != MIDX_VERSION_V2)\n \t\tdie(_(\"unknown MIDX version: %d\"), ctx.version);\ndiff --git a/t/t5319-multi-pack-index.sh b/t/t5319-multi-pack-index.sh\nindex 58e0b685b1..fa0d4046f7 100755\n--- a/t/t5319-multi-pack-index.sh\n+++ b/t/t5319-multi-pack-index.sh\n@@ -21,7 +21,7 @@ midx_read_expect () {\n \tEXTRA_CHUNKS=\"$5\"\n \t{\n \t\tcat <<-EOF &&\n-\t\theader: 4d494458 2 $HASH_LEN $NUM_CHUNKS $NUM_PACKS\n+\t\theader: 4d494458 1 $HASH_LEN $NUM_CHUNKS $NUM_PACKS\n \t\tchunks: pack-names oid-fanout oid-lookup object-offsets$EXTRA_CHUNKS\n \t\tnum_objects: $NUM_OBJECTS\n \t\tpacks:\n-- \n2.54.0.rc2.265.g593c85fc46\n\n"},{"id":"541770","messageId":"xmqqqzoezmt9.fsf@gitster.g","threadId":"65482","inReplyTo":"20260416194922.GA1887222@coredump.intra.peff.net","subject":"Re: MIDX woes, was Re: [ANNOUNCE] Git v2.54.0-rc2","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2026-04-16T20:12:50Z","receivedAt":"2026-04-16T20:12:53Z","isPatch":false,"body":"Jeff King <peff@peff.net> writes:\n\n> Yeah, I agree that re-wording would be a good idea here.\n\nI actually no longer think so.\n\n> I think this\n> can happen post-release. We'd like for this to have happened long ago,\n> but it didn't. Doing it in 2.54 versus 2.55 does not really matter, as:\n>\n>   1. We still have to worry about 2.53 and earlier anyway, so one\n>      version is not much in the grand scheme of things.\n>\n>   2. For midx v2, 2.54 knows how to read it anyway, so is not affected\n>      by the problem. ;)\n\nI agree 100% with this.\n\nLooking at the later part of load_multi_pack_index_one() function,\nit is full of die() calls, not prepared to degrade gracefully at\nall.\n\nThe reason why I do not think reword is worth doing is that as far\nas this function (i.e., \"Here is an MIDX file---please read it and\ngive me struct multi_pack_index back\") is concerned, these error\nreturns are giving diagnosis on the nature of errors.  Sometimes we\ncannot learn the length of the file, sometimes we find that the file\nis unreasonably short, sometimes it is not sorted properly, etc.\nNone of the existing \"error + cleanup\" says \"we are continuing\nanyway\" and that is good.  The decision to keep going without using\nmidx file (or not) belongs to the caller, so if we wanted to say\nthat, we should say so in the caller, not here.\n\n"},{"id":"541771","messageId":"aeFF5s5m76Yz7F/Q@nand.local","threadId":"65482","inReplyTo":"621c9da9-2ec0-462d-ae51-0be5e0ca6ab2@gmail.com","subject":"Re: MIDX woes, was Re: [ANNOUNCE] Git v2.54.0-rc2","fromName":"Taylor Blau","fromEmail":"me@ttaylorr.com","sentAt":"2026-04-16T20:26:14Z","receivedAt":"2026-04-16T20:26:19Z","isPatch":false,"body":"On Thu, Apr 16, 2026 at 09:24:31AM -0400, Derrick Stolee wrote:\n> On 4/16/2026 1:34 AM, Jeff King wrote:\n> > On Thu, Apr 16, 2026 at 01:17:33AM -0400, Jeff King wrote:\n> >\n> >> I think removing the .midx file (and optionally regenerating with the\n> >> old version) would be the appropriate workaround, but I wonder how hard\n> >> it would be to go back to generating v1 midx files by default. I know v2\n> >> is a building block for more advanced features, but for those who are\n> >> not using those features yet it is a strict regression.\n> >\n> > I think doing so is just this one-liner:\n> ...\n> > and then here we need to use v2 for the new compaction feature:\n> ...\n> > So that would make things work as usual for anybody mixing and matching\n> > multiple versions of Git, but does make life slightly worse for anybody\n> > who wants to use the new feature (they have to set the config). We might\n> > need a doc update, or possibly even to automatically default to v2 when\n> > using the compact command. But that could come post-2.54.\n> >\n> > At this point I'll stop poking and speculating and see what direction\n> > Taylor suggests. ;)\n>\n> I think this is a good change to make. This fits with the standard\n> approach of not making breaking file changes by default, but letting\n> users opt-in to new versions (at least for a few major releases).\n\nYeah, I agree, and sorry for the trouble here. A few thoughts:\n\n - In the immediate term, we should downgrade the default format to\n   write V1 MIDXs for the compatibility issues pointed out by this\n   thread. That would seem to be the minimal thing to do to make sure\n   that the 2.54 release is as smooth as possible.\n\n - In the medium term (i.e., on the other side of 2.54) we should\n   implement the changes that Peff sketched earlier in the thread to\n   make loading the MIDX robust towards unrecognized versions.\n\n   Of course, that doesn't fix any old clients who don't upgrade and at\n   some point want to fetch from or otherwise interact with a repository\n   that has a V2 MIDX. But it does improve things for, say, users that\n   are on an eventual 2.55 if we make the V1->V2 by default change in\n   2.56.\n\n - In the long term (i.e., in 2.56 or otherwise in a release after the\n   above change is implemented) we should make V2 the default format for\n   MIDXs.\n\nThanks,\nTaylor\n"},{"id":"541772","messageId":"aeFGumIlw+vcOt2a@nand.local","threadId":"65482","inReplyTo":"xmqqik9q3n15.fsf@gitster.g","subject":"Re: MIDX woes, was Re: [ANNOUNCE] Git v2.54.0-rc2","fromName":"Taylor Blau","fromEmail":"me@ttaylorr.com","sentAt":"2026-04-16T20:29:46Z","receivedAt":"2026-04-16T20:29:48Z","isPatch":false,"body":"On Thu, Apr 16, 2026 at 09:09:10AM -0700, Junio C Hamano wrote:\n> > The part that is striking about Johannes' report is that this happens\n> > on a fetch, so it is being written automatically by normal maintenance\n> > activities in that case. Without downgrading the default version back\n> > to a compatible version, deleting the multi-pack-index(es) will not\n> > keep the repo in a good state.\n>\n> I am not sure what you mean by \"deleting will not keep the\n> repository in a good state\".  Isn't multi-pack-index totall\n> optional?\n\nI am also having trouble following this.\n\nIs this saying that fetching from a remote and having a local `git\nmaintenance` (run automatically after `git fetch`) write a v2 MIDX file\nwhich is unable to be read by a separate local Git is causing the\nproblem?\n\nIf so, then I think we are operating in a mixed-version environment\nwhere some newer Git that understands the v2 format is writing it, and\nanother older Git version that doesn't is trying to read an unknown\nversion.\n\nThough I find it totally plausible that I am wildly misunderstanding\nwhat happened for Johannes here, so please let me know if I'm not seeing\nit.\n\nThanks,\nTaylor\n"},{"id":"541775","messageId":"xmqq5x5qzktp.fsf@gitster.g","threadId":"65482","inReplyTo":"20260416200659.GB1887222@coredump.intra.peff.net","subject":"Re: [PATCH] MIDX: revert the default version to v1","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2026-04-16T20:55:46Z","receivedAt":"2026-04-16T20:55:48Z","isPatch":true,"body":"Jeff King <peff@peff.net> writes:\n\n> On Thu, Apr 16, 2026 at 11:45:49AM -0700, Junio C Hamano wrote:\n>\n>> From: Jeff King <peff@peff.net>\n>> \n>> Dscho reports that fetching into a repository with Git 2.54-rc2 made\n>> it unusable with Git 2.53, as the recent code by default writes\n>> version 2 multi-pack-index files.  Version 2 is the base of more\n>> advanced features to come, but using it where these features are not\n>> used is a strict regression.\n>> \n>> As deployed versions of Git and its reimplementations may not be\n>> ready for the format bump, let's revert the default version of MIDX\n>> file we write back to V1, and adjust tests that exercise V2-specific\n>> features to explicitly request V2.\n>> \n>> Signed-off-by: Junio C Hamano <gitster@pobox.com>\n>\n> This looks fine to me, and you can add my S-o-b if you want. But let me\n> propose a slight alternative that reduces the test churn and may make\n> things easier going forward.\n\nI did merge it to 'jch' (which I also tested externally) and then\n'next', but haven't pushed out the 'next' integration out to test it\nexternally, so I'll chuck it and replace it with this version, as\nthe \"compact is the only thing that needs v2\" sound like a better\nworkaround.\n\n> diff --git a/midx-write.c b/midx-write.c\n> index 0ff2e45aa7..a89ac53045 100644\n> --- a/midx-write.c\n> +++ b/midx-write.c\n> @@ -1259,7 +1259,6 @@ static int write_midx_internal(struct write_midx_opts *opts)\n>  \tstruct tempfile *incr;\n>  \tstruct write_midx_context ctx = {\n>  \t\t.preferred_pack_idx = NO_PREFERRED_PACK,\n> -\t\t.version = MIDX_VERSION_V2,\n>  \t };\n>  \tstruct multi_pack_index *midx_to_free = NULL;\n>  \tint bitmapped_packs_concat_len = 0;\n> @@ -1275,6 +1274,9 @@ static int write_midx_internal(struct write_midx_opts *opts)\n>  \tctx.repo = r;\n>  \tctx.source = opts->source;\n>  \n> +\tctx.version = opts->flags & MIDX_WRITE_COMPACT ?\n> +\t\tMIDX_VERSION_V2 :\n> +\t\tMIDX_VERSION_V1;\n\nJust a sytle thing but I'd prefer to see this written like this:\n\n+\tctx.version = ((opts->flags & MIDX_WRITE_COMPACT)\n+\t\t       ? MIDX_VERSION_V2\n+\t\t       : MIDX_VERSION_V1);\n\nbecause you do not have to worry about the precedence between & and\n?: with an extra (parentheses), and a ternary split into multiple\nlines is easier to spot if you write it at the beginning of the\nline, with ?  and : aligned.\n\n"},{"id":"541776","messageId":"xmqq1pgezkpw.fsf@gitster.g","threadId":"65482","inReplyTo":"xmqqv7dqzoeh.fsf@gitster.g","subject":"Re: [PATCH] MIDX: revert the default version to v1","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2026-04-16T20:58:03Z","receivedAt":"2026-04-16T20:58:05Z","isPatch":true,"body":"Junio C Hamano <gitster@pobox.com> writes:\n\n> Of course, the tip of tb/incremental-midx-part-3.3 needs to be\n> adjusted with this before merging to 'seen'.  I think my tree is\n> getting ready to push the \"revert the default\" down to 'master'.\n\nI'll discard this patch, as Peff's latest one that enables v2 only\nwhen needed should make it unnecessary.\n\nThanks.\n\n\n> ----- >8 ----\n> SQUASH??? adjust for MIDX version default reversion\n>\n> diff --git a/t/t7705-repack-incremental-midx.sh b/t/t7705-repack-incremental-midx.sh\n> index 562554e69b..7eb1109ec5 100755\n> --- a/t/t7705-repack-incremental-midx.sh\n> +++ b/t/t7705-repack-incremental-midx.sh\n> @@ -63,6 +63,9 @@ create_layers () {\n>  \tdone\n>  }\n>  \n> +# These incremental MIDX tests requires the V2 format.\n> +git config --global midx.version 2\n> +\n>  test_expect_success '--write-midx=incremental without --geometric' '\n>  \tgit init incremental-without-geometric &&\n>  \t(\n"},{"id":"541777","messageId":"aeFQvu4iqJAQMjCy@nand.local","threadId":"65482","inReplyTo":"20260416200659.GB1887222@coredump.intra.peff.net","subject":"Re: [PATCH] MIDX: revert the default version to v1","fromName":"Taylor Blau","fromEmail":"me@ttaylorr.com","sentAt":"2026-04-16T21:12:30Z","receivedAt":"2026-04-16T21:12:33Z","isPatch":true,"body":"On Thu, Apr 16, 2026 at 04:06:59PM -0400, Jeff King wrote:\n> This looks fine to me, and you can add my S-o-b if you want. But let me\n> propose a slight alternative that reduces the test churn and may make\n> things easier going forward.\n\nSame here, I agree with the discussion earlier in the thread about what\nthe right short- and medium-term solutions are, and I think that\nincluding Junio's patch is a good approach.\n\nIf we take that, please also feel free to add my Acked-by, or\nReviewed-by, or similar.\n\n> -- >8 --\n> Subject: [PATCH] MIDX: revert the default version to v1\n>\n> We introduced midx version 2 in b2ec8e90c2 (midx: do not require packs\n> to be sorted in lexicographic order, 2026-02-24) and now write it by\n> default. The rationale was that older versions should ignore the v2 midx\n> and fall back to using the packs (just like we do for other midx\n> errors). Unfortunately this is not the case, as we have a hard die()\n> when we see an unknown midx version.\n>\n> As a result, writing a midx with Git 2.54-rc2 puts the repository into a\n> state that is unusable with Git 2.53. And this midx write may happen\n> behind the scenes as part of normal operations, like fetch.\n\nI'm not sure if it's worth mentioning, but I think that it's reasonable\nto say \"Git 2.53 and earlier\", with the implied lower bound being which\nversion first introduced the MIDX. I think it's equally fine as-is,\nthough.\n\n> Let's switch back to writing v1 by default to avoid regressing the case\n> where multiple versions of Git are used on the same repository.\n>\n> There is one gotcha, though: the v2 format is required for some new\n> features, like midx compaction, and running \"git multi-pack-index\n> compact\" will complain when asked to write a v1 index. The user must set\n> midx.version to \"2\" to make the feature work.\n>\n> So instead of always using v1, we'll base the default on whether the\n> requested feature requires v2. That does mean that running midx\n> compaction will create a repository that can't be read by older versions\n> of Git. But we never do that by default; only people experimenting with\n> the new feature will be affected.\n>\n> We have to adjust the test expectation in t5319, since it will now\n> generate v1 files. And our \"auto-select v2\" is covered by the tests in\n> t5335, which continue to check that compaction works without having to\n> set midx.version manually (and also explicitly check that asking for v1\n> with compaction reports the problem).\n\nI think that the test fallout that Junio's patch necessitates isn't all\nthat bad, and in some sense I think the \"write version 1 usually, but\nversion 2 if the feature requires it\" is a little magical. That being\nsaid, anyone doing things that would require a v2 MIDX likely already\nunderstand what the trade-offs are, so in that sense I think that this\nis less magical and more \"do the sensible thing by default\".\n\nI don't have strong feelings either way and would be fine with either. I\nthink if anything I have a vague preference towards the approach taken\nhere, but either would be fine with me.\n\n> Signed-off-by: Jeff King <peff@peff.net>\n> ---\n> I have a feeling there are probably some gaps in v2 testing in t5319,\n> since we are no longer using v2 for the bulk of the tests. IMHO that is\n> OK to sort out post-release.\n\nPerhaps, although you could make the opposite argument for v1 MIDXs\nwhen we previously switched the default to write v2 MIDXs. The format\ndiffers only in the version field, and the ordering constraints on the\npacks within the MIDX. That area and the compatibility issues here are\nthe \"interesting\" parts to test IMHO.\n\n>  Documentation/git-multi-pack-index.adoc | 3 +++\n>  midx-write.c                            | 4 +++-\n>  t/t5319-multi-pack-index.sh             | 2 +-\n>  3 files changed, 7 insertions(+), 2 deletions(-)\n\nThe patch itself looks as expected to me. Thanks for working on it, and\nsorry again for the mess here.\n\nThanks,\nTaylor\n"},{"id":"541778","messageId":"aeFQ45A/2W4WidSq@nand.local","threadId":"65482","inReplyTo":"xmqq1pgezkpw.fsf@gitster.g","subject":"Re: [PATCH] MIDX: revert the default version to v1","fromName":"Taylor Blau","fromEmail":"me@ttaylorr.com","sentAt":"2026-04-16T21:13:07Z","receivedAt":"2026-04-16T21:13:09Z","isPatch":true,"body":"On Thu, Apr 16, 2026 at 01:58:03PM -0700, Junio C Hamano wrote:\n> Junio C Hamano <gitster@pobox.com> writes:\n>\n> > Of course, the tip of tb/incremental-midx-part-3.3 needs to be\n> > adjusted with this before merging to 'seen'.  I think my tree is\n> > getting ready to push the \"revert the default\" down to 'master'.\n>\n> I'll discard this patch, as Peff's latest one that enables v2 only\n> when needed should make it unnecessary.\n\nYup, makes sense and sounds good.\n\nThanks,\nTaylor\n"},{"id":"541788","messageId":"20260416232319.GA1904316@coredump.intra.peff.net","threadId":"65482","inReplyTo":"xmqqqzoezmt9.fsf@gitster.g","subject":"Re: MIDX woes, was Re: [ANNOUNCE] Git v2.54.0-rc2","fromName":"Jeff King","fromEmail":"peff@peff.net","sentAt":"2026-04-16T23:23:19Z","receivedAt":"2026-04-16T23:23:21Z","isPatch":false,"body":"On Thu, Apr 16, 2026 at 01:12:50PM -0700, Junio C Hamano wrote:\n\n> Looking at the later part of load_multi_pack_index_one() function,\n> it is full of die() calls, not prepared to degrade gracefully at\n> all.\n\nOK, I confess I did not look past the two goto calls below the lines I\ntouched, since I didn't think we'd be applying it immediately anyway.\n\n> The reason why I do not think reword is worth doing is that as far\n> as this function (i.e., \"Here is an MIDX file---please read it and\n> give me struct multi_pack_index back\") is concerned, these error\n> returns are giving diagnosis on the nature of errors.  Sometimes we\n> cannot learn the length of the file, sometimes we find that the file\n> is unreasonably short, sometimes it is not sorted properly, etc.\n> None of the existing \"error + cleanup\" says \"we are continuing\n> anyway\" and that is good.  The decision to keep going without using\n> midx file (or not) belongs to the caller, so if we wanted to say\n> that, we should say so in the caller, not here.\n\nYep, I agree with all of that.\n\n-Peff\n"},{"id":"541789","messageId":"20260416232455.GB1904316@coredump.intra.peff.net","threadId":"65482","inReplyTo":"xmqq5x5qzktp.fsf@gitster.g","subject":"Re: [PATCH] MIDX: revert the default version to v1","fromName":"Jeff King","fromEmail":"peff@peff.net","sentAt":"2026-04-16T23:24:55Z","receivedAt":"2026-04-16T23:24:57Z","isPatch":true,"body":"On Thu, Apr 16, 2026 at 01:55:46PM -0700, Junio C Hamano wrote:\n\n> > +\tctx.version = opts->flags & MIDX_WRITE_COMPACT ?\n> > +\t\tMIDX_VERSION_V2 :\n> > +\t\tMIDX_VERSION_V1;\n> \n> Just a sytle thing but I'd prefer to see this written like this:\n> \n> +\tctx.version = ((opts->flags & MIDX_WRITE_COMPACT)\n> +\t\t       ? MIDX_VERSION_V2\n> +\t\t       : MIDX_VERSION_V1);\n> \n> because you do not have to worry about the precedence between & and\n> ?: with an extra (parentheses), and a ternary split into multiple\n> lines is easier to spot if you write it at the beginning of the\n> line, with ?  and : aligned.\n\nOK. I like the \"?\" at the end of the first line, since it makes it clear\nfrom just that line that it is a conditional and not a direct\nassignment. But I don't overly care, and if you want to mark it up as\nyou apply (if it is not already too late), I am fine with that.\n\n-Peff\n"},{"id":"541790","messageId":"20260416232601.GA1904594@coredump.intra.peff.net","threadId":"65482","inReplyTo":"20260416232455.GB1904316@coredump.intra.peff.net","subject":"Re: [PATCH] MIDX: revert the default version to v1","fromName":"Jeff King","fromEmail":"peff@peff.net","sentAt":"2026-04-16T23:26:01Z","receivedAt":"2026-04-16T23:26:04Z","isPatch":true,"body":"On Thu, Apr 16, 2026 at 07:24:55PM -0400, Jeff King wrote:\n\n> > Just a sytle thing but I'd prefer to see this written like this:\n> > \n> > +\tctx.version = ((opts->flags & MIDX_WRITE_COMPACT)\n> > +\t\t       ? MIDX_VERSION_V2\n> > +\t\t       : MIDX_VERSION_V1);\n> > \n> > because you do not have to worry about the precedence between & and\n> > ?: with an extra (parentheses), and a ternary split into multiple\n> > lines is easier to spot if you write it at the beginning of the\n> > line, with ?  and : aligned.\n> \n> OK. I like the \"?\" at the end of the first line, since it makes it clear\n> from just that line that it is a conditional and not a direct\n> assignment. But I don't overly care, and if you want to mark it up as\n> you apply (if it is not already too late), I am fine with that.\n\nAh, I just fetched next and saw that you did so already. Good. :)\n\n-Peff\n"},{"id":"541791","messageId":"20260416232755.GC1904316@coredump.intra.peff.net","threadId":"65482","inReplyTo":"aeFQvu4iqJAQMjCy@nand.local","subject":"Re: [PATCH] MIDX: revert the default version to v1","fromName":"Jeff King","fromEmail":"peff@peff.net","sentAt":"2026-04-16T23:27:55Z","receivedAt":"2026-04-16T23:27:57Z","isPatch":true,"body":"On Thu, Apr 16, 2026 at 05:12:30PM -0400, Taylor Blau wrote:\n\n> > As a result, writing a midx with Git 2.54-rc2 puts the repository into a\n> > state that is unusable with Git 2.53. And this midx write may happen\n> > behind the scenes as part of normal operations, like fetch.\n> \n> I'm not sure if it's worth mentioning, but I think that it's reasonable\n> to say \"Git 2.53 and earlier\", with the implied lower bound being which\n> version first introduced the MIDX. I think it's equally fine as-is,\n> though.\n\nYeah, that is a little more clear. Looks like it's been pushed out to\nnext already, though.\n\n> > I have a feeling there are probably some gaps in v2 testing in t5319,\n> > since we are no longer using v2 for the bulk of the tests. IMHO that is\n> > OK to sort out post-release.\n> \n> Perhaps, although you could make the opposite argument for v1 MIDXs\n> when we previously switched the default to write v2 MIDXs. The format\n> differs only in the version field, and the ordering constraints on the\n> packs within the MIDX. That area and the compatibility issues here are\n> the \"interesting\" parts to test IMHO.\n\nI think that t5319 specifically writes a few midxs with v1 to test the\nordering constraints. Probably there should now be some v2 specific\ntests in the same way. I was hoping you could pick up the pieces there,\npost-2.54.\n\n-Peff\n"},{"id":"541792","messageId":"20260416232941.GD1904316@coredump.intra.peff.net","threadId":"65482","inReplyTo":"aeFF5s5m76Yz7F/Q@nand.local","subject":"Re: MIDX woes, was Re: [ANNOUNCE] Git v2.54.0-rc2","fromName":"Jeff King","fromEmail":"peff@peff.net","sentAt":"2026-04-16T23:29:41Z","receivedAt":"2026-04-16T23:29:43Z","isPatch":false,"body":"On Thu, Apr 16, 2026 at 04:26:14PM -0400, Taylor Blau wrote:\n\n> Yeah, I agree, and sorry for the trouble here. A few thoughts:\n> \n>  - In the immediate term, we should downgrade the default format to\n>    write V1 MIDXs for the compatibility issues pointed out by this\n>    thread. That would seem to be the minimal thing to do to make sure\n>    that the 2.54 release is as smooth as possible.\n> \n>  - In the medium term (i.e., on the other side of 2.54) we should\n>    implement the changes that Peff sketched earlier in the thread to\n>    make loading the MIDX robust towards unrecognized versions.\n> \n>    Of course, that doesn't fix any old clients who don't upgrade and at\n>    some point want to fetch from or otherwise interact with a repository\n>    that has a V2 MIDX. But it does improve things for, say, users that\n>    are on an eventual 2.55 if we make the V1->V2 by default change in\n>    2.56.\n> \n>  - In the long term (i.e., in 2.56 or otherwise in a release after the\n>    above change is implemented) we should make V2 the default format for\n>    MIDXs.\n\nThat all seems reasonable. I think the only question is how long the \"in\nthe long term\" period should be. Two versions is not very long,\nespecially for people who are using OS packages (think moving from one\nDebian stable release to another). But that can be sorted out later.\n\n-Peff\n"},{"id":"541807","messageId":"xmqqqzoexlwt.fsf@gitster.g","threadId":"65482","inReplyTo":"20260416232319.GA1904316@coredump.intra.peff.net","subject":"Re: MIDX woes, was Re: [ANNOUNCE] Git v2.54.0-rc2","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2026-04-17T04:15:14Z","receivedAt":"2026-04-17T04:15:16Z","isPatch":false,"body":"Jeff King <peff@peff.net> writes:\n\n> On Thu, Apr 16, 2026 at 01:12:50PM -0700, Junio C Hamano wrote:\n>\n>> Looking at the later part of load_multi_pack_index_one() function,\n>> it is full of die() calls, not prepared to degrade gracefully at\n>> all.\n>\n> OK, I confess I did not look past the two goto calls below the lines I\n> touched, since I didn't think we'd be applying it immediately anyway.\n\nHeh, I confess I did not look, either, until I decided I have to\nrespond to your message ;-)\n\n>> The reason why I do not think reword is worth doing is that as far\n>> as this function (i.e., \"Here is an MIDX file---please read it and\n>> give me struct multi_pack_index back\") is concerned, these error\n>> returns are giving diagnosis on the nature of errors.  Sometimes we\n>> cannot learn the length of the file, sometimes we find that the file\n>> is unreasonably short, sometimes it is not sorted properly, etc.\n>> None of the existing \"error + cleanup\" says \"we are continuing\n>> anyway\" and that is good.  The decision to keep going without using\n>> midx file (or not) belongs to the caller, so if we wanted to say\n>> that, we should say so in the caller, not here.\n>\n> Yep, I agree with all of that.\n\nYup, I would feel safer to have those who know this code path better\nto help us decide if it makes sense to turn all of these die() calls\nto error + cleanup.\n\nIn any case, that would be an issue for much later.\n\nThanks.\n\n"},{"id":"541825","messageId":"xmqq5x5py5ql.fsf@gitster.g","threadId":"65482","inReplyTo":"xmqqqzohd0sh.fsf@gitster.g","subject":"Re: [ANNOUNCE] Git v2.54.0-rc2","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2026-04-17T15:19:14Z","receivedAt":"2026-04-17T15:19:17Z","isPatch":false,"body":"An update to 'master' has been pushed out, which contains\nwork by Elijah Newren, Jeff King, and Johannes Schindelin,\non these issues:\n\n * documentation fixes (typoes, grammos, phrasos)\n * fix to MIDX that wrote version2 file unnecessarily\n * update for Coverity CI job.\n\nGit 2.54 final will be tagged at 10:00 US/Pacific (17:00 UTC) on\nMonday, Apri 20th, and I plan to go offline for a week or two\nimmediately after that, so this pushout will pretty much be the\nfinal shape of what should be in Git 2.54 final (modulo l10n),\nalthough I might have another update later today.\n\nChanges since v2.54.0-rc2 are as follows:\n\nElijah Newren (6):\n      RelNotes/2.54.0: fix typos and grammar\n      CodingGuidelines: fix subject-verb agreement\n      doc: fix self-referential config in sendemail.smtpSSLClientKey\n      doc: fix plural agreement in pack.preferBitmapTips\n      doc: fix singular/plural mismatch in git-rerere\n      doc: fix grammar errors in submodule description\n\nJeff King (1):\n      MIDX: revert the default version to v1\n\nJohannes Schindelin (1):\n      codeql: bump actions/cache from 4 to 5\n\n"},{"id":"541829","messageId":"CABPp-BHEL4upLLjFL_1j7HRov5oAUxgofocU_6G_562biCp=4g@mail.gmail.com","threadId":"65482","inReplyTo":"xmqq5x5py5ql.fsf@gitster.g","subject":"Re: [ANNOUNCE] Git v2.54.0-rc2","fromName":"Elijah Newren","fromEmail":"newren@gmail.com","sentAt":"2026-04-17T17:03:27Z","receivedAt":"2026-04-17T17:03:51Z","isPatch":false,"body":"On Fri, Apr 17, 2026 at 8:21 AM Junio C Hamano <gitster@pobox.com> wrote:\n>\n> ...this pushout will pretty much be the\n> final shape of what should be in Git 2.54 final (modulo l10n),\n> although I might have another update later today.\n\nI did find a pair of new issues in 2.54 (NULL pointer dereference,\nread past end of string), which might be worth considering for the .0\nrelease on Monday (see\nhttps://lore.kernel.org/git/pull.2093.git.1776443163041.gitgitgadget@gmail.com/).\nIt is only triggered with core.quotePath=false and some pretty crazy\nfilenames, so I could see delaying that patch until .1, but I thought\nI'd bring it up for consideration.  Sorry for not spotting the issue\nsooner.\n"},{"id":"541892","messageId":"24a970c5-0d01-4f1d-b6ea-50be646351b3@gmail.com","threadId":"65482","inReplyTo":"aeFGumIlw+vcOt2a@nand.local","subject":"Re: MIDX woes, was Re: [ANNOUNCE] Git v2.54.0-rc2","fromName":"Derrick Stolee","fromEmail":"stolee@gmail.com","sentAt":"2026-04-19T22:41:11Z","receivedAt":"2026-04-19T22:41:14Z","isPatch":false,"body":"On 4/16/26 4:29 PM, Taylor Blau wrote:\n> On Thu, Apr 16, 2026 at 09:09:10AM -0700, Junio C Hamano wrote:\n>>> The part that is striking about Johannes' report is that this happens\n>>> on a fetch, so it is being written automatically by normal maintenance\n>>> activities in that case. Without downgrading the default version back\n>>> to a compatible version, deleting the multi-pack-index(es) will not\n>>> keep the repo in a good state.\n>>\n>> I am not sure what you mean by \"deleting will not keep the\n>> repository in a good state\".  Isn't multi-pack-index totall\n>> optional?\n> \n> I am also having trouble following this.\n\nMy wording was bad, but I just meant that in this scenario the\nmaintenance was generating a new multi-pack-index without the\nuser directly requesting it. If the two Git versions are still\ninteracting (or Git 2.25.0 and libgit2 or similar) such that\nthe multi-pack-index continues regenerating with version 2,\nthen the deletion doesn't fix it _forever_.\n\nThanks,\n-Stolee\n\n"},{"id":"541901","messageId":"xmqq5x5mv1mz.fsf@gitster.g","threadId":"65482","inReplyTo":"24a970c5-0d01-4f1d-b6ea-50be646351b3@gmail.com","subject":"Re: MIDX woes, was Re: [ANNOUNCE] Git v2.54.0-rc2","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2026-04-20T01:52:52Z","receivedAt":"2026-04-20T01:52:55Z","isPatch":false,"body":"Derrick Stolee <stolee@gmail.com> writes:\n\n> ... interacting (or Git 2.25.0 and libgit2 or similar) such that\n> the multi-pack-index continues regenerating with version 2,\n> then the deletion doesn't fix it _forever_.\n\nYeah, delete and then set the configuration to force use of version\n1 would have been needed, unless we took Peff's fix that is in\n'master'.\n\nThanks for clarification.\n"}]}