)]}'
{
  "log": [
    {
      "commit": "7e34d8174dcda3435d1404c9a30bef46afe6c13e",
      "tree": "2b6ab95d4c8ad3596b437a54b9e1ef9cd566c805",
      "parents": [
        "7ac84b7267798310719815dc0c16230587cb7028"
      ],
      "author": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Thu Oct 22 07:22:36 2026 -0700"
      },
      "committer": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Thu Oct 22 07:23:16 2026 -0700"
      },
      "message": "The 8th batch\n\nSigned-off-by: Junio C Hamano \u003cgitster@pobox.com\u003e\n"
    },
    {
      "commit": "7ac84b7267798310719815dc0c16230587cb7028",
      "tree": "5147563137673ed31847b9384830cfb79316cdd6",
      "parents": [
        "8f352ee2dc57db650acbfb04e04307257bb814ce",
        "60e16b0387ae9100952a789ac5fa21127cebb28a"
      ],
      "author": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Thu Oct 22 07:23:16 2026 -0700"
      },
      "committer": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Thu Oct 22 07:23:16 2026 -0700"
      },
      "message": "Merge branch \u0027oa/delta-islands-i18n-use-q\u0027\n\nThe progress message emitted by the \u0027delta-islands\u0027 subsystem has\nbeen updated to use the Q_() macro, allowing translators to properly\nhandle plural forms based on the number of islands marked.\n\n* oa/delta-islands-i18n-use-q:\n  delta-islands: use Q_() for island count\n"
    },
    {
      "commit": "8f352ee2dc57db650acbfb04e04307257bb814ce",
      "tree": "994cb0a8480718557c36fcc40940e0abe17b7e60",
      "parents": [
        "49403519294975852624352ba976b5359027cd5a",
        "1c0cec6657bf901090544479246ca9d7428ffad4"
      ],
      "author": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Thu Oct 22 07:23:16 2026 -0700"
      },
      "committer": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Thu Oct 22 07:23:16 2026 -0700"
      },
      "message": "Merge branch \u0027ss/history-sign-rewrites\u0027\n\nThe git history command and its subcommands have been updated to\nhonor the commit.gpgSign configuration variable and accept the\n--gpg-sign and --no-gpg-sign command-line options, ensuring both\nrewritten commits and their replayed descendants are\ncryptographically signed by the committer.\n\n* ss/history-sign-rewrites:\n  history: sign rewritten commits\n  replay: allow callers to sign commits\n"
    },
    {
      "commit": "49403519294975852624352ba976b5359027cd5a",
      "tree": "746720aef772d56e9c13646e7d2c6330e5a9a188",
      "parents": [
        "b26dc1274c00cea4e35b6ca2e5e360f363ba23b4",
        "470c6e9fe2f5b3c260a757ef95ec3dab45710248"
      ],
      "author": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Thu Oct 22 07:23:16 2026 -0700"
      },
      "committer": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Thu Oct 22 07:23:16 2026 -0700"
      },
      "message": "Merge branch \u0027hn/ci-leak-sanitizer-annotations\u0027\n\nCI on GitHub Actions gets a better annotation experience.  Leak test\nscripts are stopped at their first failure with --immediate to\nprevent flooding the log, and failures are correctly annotated with\ntheir file and line number.\n\n* hn/ci-leak-sanitizer-annotations:\n  ci: point test failures and fixed known breakages at their file and line\n  ci: annotate leaks and stop a leak-sanitizer script at its first failure\n"
    },
    {
      "commit": "b26dc1274c00cea4e35b6ca2e5e360f363ba23b4",
      "tree": "085eb868de6bd72cb8097f52011c3e649ec0608c",
      "parents": [
        "ad72032c8db3c5bf73e00a7e2cf4e257b652dabf",
        "d5f4e42f02214b5d5af23578a4ad8de66427840d"
      ],
      "author": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Thu Oct 22 07:23:15 2026 -0700"
      },
      "committer": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Thu Oct 22 07:23:16 2026 -0700"
      },
      "message": "Merge branch \u0027pw/checkout-m-conflict-labels\u0027\n\nWhen recreating a merge conflict using \u0027git checkout -m\u0027, the\noriginal conflict labels (such as branch names) were lost and\nreplaced with generic ones.  The merge machinery has been updated to\nrecord the original labels in \u0027.git/MERGE_LABELS\u0027, allowing \u0027git\ncheckout -m\u0027 to restore them.\n\n* pw/checkout-m-conflict-labels:\n  merge: remember conflict labels\n  checkout -m \u003cpath\u003e: cache merge settings\n  remove_branch_state: convert boolean argument to flags\n"
    },
    {
      "commit": "ad72032c8db3c5bf73e00a7e2cf4e257b652dabf",
      "tree": "74f95c64f82224f7d5746669018af852b3bcc34d",
      "parents": [
        "d9c4679fa88988cefe1e378d6bb6c953436b56e6",
        "01de14365ddfb37ec0745bd4661c469e9ba6a684"
      ],
      "author": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Thu Oct 22 07:23:15 2026 -0700"
      },
      "committer": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Thu Oct 22 07:23:15 2026 -0700"
      },
      "message": "Merge branch \u0027bb/unicode-width-table-18\u0027\n\nUnicode character width table has been updated to match\nUnicode 18 announced on 2026-09-16.\n\n* bb/unicode-width-table-18:\n  unicode: update the width tables to Unicode 18\n"
    },
    {
      "commit": "d9c4679fa88988cefe1e378d6bb6c953436b56e6",
      "tree": "48a6cdcf02729bddd82d5c3926bd1efd6c2c4479",
      "parents": [
        "47fdf2208c5b94c8cc01c106b8f7c85efb91c926",
        "85c7f5e7dac12e31444e9bab95e1af7fa74955eb"
      ],
      "author": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Thu Oct 22 07:23:15 2026 -0700"
      },
      "committer": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Thu Oct 22 07:23:15 2026 -0700"
      },
      "message": "Merge branch \u0027cc/lazy-fetch-trusted-bit\u0027\n\nA new \u0027uploadpack.lazyFetchTrusted\u0027 configuration variable has been\nintroduced to allow \u0027upload-pack\u0027 to lazily fetch missing objects from\nconfigured promisor remotes when serving trusted repositories.\n\n* cc/lazy-fetch-trusted-bit:\n  builtin/upload-pack: don\u0027t disable lazy fetching on trusted repo\n  promisor-remote: prevent infinite recursion when lazy fetching\n  upload-pack: read uploadpack.lazyFetchTrusted\n  setup: extract path_allowlist_apply()\n  promisor-remote: factor out lazy_fetch_objects()\n"
    },
    {
      "commit": "47fdf2208c5b94c8cc01c106b8f7c85efb91c926",
      "tree": "006b28c5d4599d10965d9e5bbe22450db8c24eca",
      "parents": [
        "b4b80b4885038ebe3f3e61a7ae2961ab1991a75f"
      ],
      "author": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Mon Oct 19 12:22:32 2026 -0700"
      },
      "committer": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Mon Oct 19 12:22:54 2026 -0700"
      },
      "message": "The 7th batch\n\nSigned-off-by: Junio C Hamano \u003cgitster@pobox.com\u003e\n"
    },
    {
      "commit": "b4b80b4885038ebe3f3e61a7ae2961ab1991a75f",
      "tree": "1822d4259929784e34fa728cbb4010df561dbb61",
      "parents": [
        "3bba248c2c2d57c4ba566cb1f103f744795132c5",
        "b1be790f3871c400269fc576cf0002650e636d5a"
      ],
      "author": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Mon Oct 19 12:22:54 2026 -0700"
      },
      "committer": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Mon Oct 19 12:22:54 2026 -0700"
      },
      "message": "Merge branch \u0027hn/t7004-flaky-gpg-test-fix\u0027\n\nThe test for verifying a signed tag with a missing key has been\nupdated to point GNUPGHOME to an unused directory rather than\ndeleting the active gpghome directory, working around a flaky rm\nfailure caused by the background gpg-agent observed on Alpine.\n\n* hn/t7004-flaky-gpg-test-fix:\n  t7004: check a missing key without deleting gpghome\n"
    },
    {
      "commit": "3bba248c2c2d57c4ba566cb1f103f744795132c5",
      "tree": "aaa7cd344aa8ef0320b889303da5ae411644b125",
      "parents": [
        "583e98cd091c78e22450a000c163d98ca4bc2b20",
        "b6d18b5d68a0c8682b53c5e18d9c58421356e2c7"
      ],
      "author": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Mon Oct 19 12:22:54 2026 -0700"
      },
      "committer": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Mon Oct 19 12:22:54 2026 -0700"
      },
      "message": "Merge branch \u0027je/status-merge-specific-help\u0027\n\n\"git status\" now suggests to use \u0027git merge --continue\u0027, not \u0027git commit\u0027,\nwhen done with conflicts during a \u0027git merge\u0027.\n\n* je/status-merge-specific-help:\n  status: suggest `git merge --continue`, not `git commit`\n"
    },
    {
      "commit": "583e98cd091c78e22450a000c163d98ca4bc2b20",
      "tree": "724ce22644afe79296d169d3f1b70a0a338992c6",
      "parents": [
        "f2b7511422361667175a17236f09e0a24c278931",
        "0ba59c845312f5b098b4ab27ae2f60988954d7b5"
      ],
      "author": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Mon Oct 19 12:22:53 2026 -0700"
      },
      "committer": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Mon Oct 19 12:22:54 2026 -0700"
      },
      "message": "Merge branch \u0027ps/odb-files-alternates\u0027\n\nThe odb_source API has been refactored to make alternates an\nimplementation detail of the files backend instead of managing them\nat the core object database layer.\n\n* ps/odb-files-alternates:\n  odb/source: drop `read_alternates` callback\n  odb/source-files: move alternates into the backend\n  odb/source-files: extract reading alternates\n  odb/source: make `will_destroy` an implementation detail\n  tmp-objdir: replace primary source at creation time\n  tmp-objdir: manage quarantine as an object directory\n  tmp-objdir: absorb logic to set and restore primary sources\n  odb/source-files: add the ability to have multiple object dirs\n  odb: refactor `odb_find_source()` to yield dirs\n  odb: refactor `odb_for_each_alternate()` to yield dirs\n  odb/source-files: introduce `struct odb_files_dir`\n  commit-graph: stop depending on `struct odb_source`\n  commit-graph: require resolved packfile paths for `stdin_packs`\n"
    },
    {
      "commit": "f2b7511422361667175a17236f09e0a24c278931",
      "tree": "9a0442c9145edfddd5a380bcd7b7c301caacc574",
      "parents": [
        "fc70f528aa1927012538052014d7ea784b5a38fa",
        "cef2d8c4cbca930c4f57e81739fe1663be7ab18d"
      ],
      "author": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Mon Oct 19 12:22:53 2026 -0700"
      },
      "committer": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Mon Oct 19 12:22:53 2026 -0700"
      },
      "message": "Merge branch \u0027kk/fetch-write-commit-graph-incremental\u0027\n\nThe fetch.writeCommitGraph behavior has been optimized to\nincrementally update the commit graph using only the newly fetched\ncommits as seeds.  This avoids a full reachability scan of all\nreferences and drastically reduces the post-fetch commit-graph\nupdate time for repositories with many references.\n\n* kk/fetch-write-commit-graph-incremental:\n  fetch: write commit-graph using updated refs only\n  test-tool read-graph: add commit-info subcommand\n"
    },
    {
      "commit": "fc70f528aa1927012538052014d7ea784b5a38fa",
      "tree": "5ab72ef53f8bf19272808ef1c3e69facde4cc0d8",
      "parents": [
        "80502091b8e7b9d3ed773482ea7d5e2dad72b484",
        "a61035fab9299de25ef46bbaedccd08734ce66c9"
      ],
      "author": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Mon Oct 19 12:22:53 2026 -0700"
      },
      "committer": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Mon Oct 19 12:22:53 2026 -0700"
      },
      "message": "Merge branch \u0027kn/packed-refs-verbatim-write\u0027\n\nThe routine that rewrites the packed-refs file has been optimized to\ndirectly pass unmodified reference records verbatim to the output\nvia fwrite(3p), instead of redundantly re-formatting them with\nfprintf(3p).\n\n* kn/packed-refs-verbatim-write:\n  packed-refs: use `fwrite()` when passing refs verbatim\n"
    },
    {
      "commit": "80502091b8e7b9d3ed773482ea7d5e2dad72b484",
      "tree": "5dc7c5bd8a393161149f56d0104880e29d296d46",
      "parents": [
        "6948b044581f0f1e397c5b95580c01974c7c77e2",
        "86129fddb7e68efa8a6da682e6eced3ade4d943b"
      ],
      "author": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Mon Oct 19 12:22:53 2026 -0700"
      },
      "committer": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Mon Oct 19 12:22:53 2026 -0700"
      },
      "message": "Merge branch \u0027ch/fetch-followremotehead-lazy-validation\u0027\n\nValidation of the \u0027fetch.followRemoteHEAD\u0027 configuration variable\nhas been deferred to when it is actually used, preventing irrelevant\nwarnings during \u0027git fetch\u0027 invocations that do not consult it.\n\n* ch/fetch-followremotehead-lazy-validation:\n  fetch.c: defer fetch.followRemoteHEAD validation\n"
    },
    {
      "commit": "6948b044581f0f1e397c5b95580c01974c7c77e2",
      "tree": "d5c6972a0859dcb7cc33cba6efa1769d801a90e4",
      "parents": [
        "c51408889c3b372814bc20b9431c3b74d0d268eb",
        "8d596ea8e77711ab0109e301f71da0929bca6582"
      ],
      "author": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Mon Oct 19 12:22:52 2026 -0700"
      },
      "committer": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Mon Oct 19 12:22:52 2026 -0700"
      },
      "message": "Merge branch \u0027ps/packfile-stale-delta-base-cache-fix\u0027\n\nClosing a packfile did not evict the entries belonging to it from\nthe delta base cache, which could lead to data corruption when a\nnewly allocated packfile happened to reuse the same memory address.\nThe cache eviction logic has been updated to remove these stale\nentries upon closing a pack\n\n* ps/packfile-stale-delta-base-cache-fix:\n  packfile: fix corruption due to stale delta base cache entries\n  packfile: move around `close_pack()`\n"
    },
    {
      "commit": "c51408889c3b372814bc20b9431c3b74d0d268eb",
      "tree": "d86c16f3afaffb4b5b6db22366d397ccbb9420b9",
      "parents": [
        "a3059f04e360993ec265de7c8afbac83a772f5ab"
      ],
      "author": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Fri Oct 16 07:47:04 2026 -0700"
      },
      "committer": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Fri Oct 16 07:47:19 2026 -0700"
      },
      "message": "The 6th batch\n\nSigned-off-by: Junio C Hamano \u003cgitster@pobox.com\u003e\n"
    },
    {
      "commit": "a3059f04e360993ec265de7c8afbac83a772f5ab",
      "tree": "4025d1d697442f3b769147844096336a6d08683e",
      "parents": [
        "02c88ed90a9a8dbb65fd29b62b61d9055905cbf6",
        "49e646f1c9a2f130690b92773fe3c2095dcbbacb"
      ],
      "author": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Fri Oct 16 07:47:19 2026 -0700"
      },
      "committer": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Fri Oct 16 07:47:19 2026 -0700"
      },
      "message": "Merge branch \u0027dk/fix-shattered-io-link\u0027\n\nReplace a link to a site that disappeared with a link to web archive\nof the last known good copy.\n\n* dk/fix-shattered-io-link:\n  doc: fix shattered.io link\n"
    },
    {
      "commit": "02c88ed90a9a8dbb65fd29b62b61d9055905cbf6",
      "tree": "9bbdd3922ad808cfedfa56e8bcfae244859d6ebb",
      "parents": [
        "3fb69375f116b31cc47942f6662343cbd12b046e",
        "6faaf59b8b977c263ab534c5b33ac4768d68b565"
      ],
      "author": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Fri Oct 16 07:47:18 2026 -0700"
      },
      "committer": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Fri Oct 16 07:47:19 2026 -0700"
      },
      "message": "Merge branch \u0027ma/t0450-use-test-path-is-file\u0027\n\nA test script (t0450) has been updated to use the test_path_is_file\nand test_path_is_missing helper functions, which provides better\ndiagnostic output on failure.\n\n* ma/t0450-use-test-path-is-file:\n  t0450: use test_path_is_file and test_path_is_missing\n"
    },
    {
      "commit": "3fb69375f116b31cc47942f6662343cbd12b046e",
      "tree": "bab59f91321c63a69247cb7363bc35b23bb03f65",
      "parents": [
        "cc6a26fab556d5ca8d3ca51a7c48b6bd2d503307",
        "fbbc33935a25cef04374de911b7b9f73e6e8c70c"
      ],
      "author": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Fri Oct 16 07:47:18 2026 -0700"
      },
      "committer": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Fri Oct 16 07:47:18 2026 -0700"
      },
      "message": "Merge branch \u0027je/doc-section-7-synopsis\u0027\n\nThe requirement for a \u0027SYNOPSIS\u0027 section in section 7 manual pages\nhas been relaxed by updating the linter script, and dummy\n\u0027SYNOPSIS\u0027 sections from existing section 7 documentation have been\nremoved to improve the rendered output\n\n* je/doc-section-7-synopsis:\n  doc: don\u0027t require a SYNOPSIS in section 7\n"
    },
    {
      "commit": "cc6a26fab556d5ca8d3ca51a7c48b6bd2d503307",
      "tree": "78bb2286d103eedd5cfdb737fa0b13416e14e508",
      "parents": [
        "d8d02ce25f2722f19a367da7f0f30e93ca9bfc6e",
        "e2d64bd041a7836e25eca884a48932133ed51b8d"
      ],
      "author": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Fri Oct 16 07:47:18 2026 -0700"
      },
      "committer": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Fri Oct 16 07:47:18 2026 -0700"
      },
      "message": "Merge branch \u0027jk/t5551-test-shell-quote-fix\u0027\n\nThe shell quoting of a lazy prereq script was quoted incorrectly and\nallowed variables dereferenced at the wrong moment, breaking the\ncurl version detection.\n\n* jk/t5551-test-shell-quote-fix:\n  t5551: fix quoting in curl version bug prereq\n"
    },
    {
      "commit": "d8d02ce25f2722f19a367da7f0f30e93ca9bfc6e",
      "tree": "8c6d6f59e313f77c6d79ea174d0290653baf5b13",
      "parents": [
        "2341e1d74c495d8853f6ff401d811b2a3b5b239c",
        "c7860da7db9e9a9ce462bf511b36c5b21b544cbf"
      ],
      "author": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Fri Oct 16 07:47:18 2026 -0700"
      },
      "committer": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Fri Oct 16 07:47:18 2026 -0700"
      },
      "message": "Merge branch \u0027tz/doc-override-less-env\u0027\n\nThe documentation for core.pager has been updated to provide\nexamples of overriding the LESS environment variable for custom\npagers by prefixing the pager command in the configuration.\n\n* tz/doc-override-less-env:\n  doc: add more examples of overriding LESS in core.pager\n"
    },
    {
      "commit": "2341e1d74c495d8853f6ff401d811b2a3b5b239c",
      "tree": "b5a515e3b81918e1df0ca41c15f1eab620755640",
      "parents": [
        "f57c9a73884400380bddd172acc88b569834f909",
        "4811dabed745f117eabc9f79ecf4cb40cdf324c6"
      ],
      "author": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Fri Oct 16 07:47:18 2026 -0700"
      },
      "committer": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Fri Oct 16 07:47:18 2026 -0700"
      },
      "message": "Merge branch \u0027gm/filter-branch-state-map-fix\u0027\n\nThe commit map populated from the state branch in \u0027git\nfilter-branch\u0027 has been corrected to parse the map using the\noriginal-to-rewritten order.\n\n* gm/filter-branch-state-map-fix:\n  filter-branch: fix commit map init from state branch\n"
    },
    {
      "commit": "f57c9a73884400380bddd172acc88b569834f909",
      "tree": "82659979b9e3cda0d6f06b5ffa2bf3681d9f290a",
      "parents": [
        "c2593bc14c8b0c3d3a3347d3db94ebbe3b9f399b"
      ],
      "author": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Thu Oct 15 07:44:03 2026 -0700"
      },
      "committer": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Thu Oct 15 07:44:31 2026 -0700"
      },
      "message": "The 5th batch\n\nSigned-off-by: Junio C Hamano \u003cgitster@pobox.com\u003e\n"
    },
    {
      "commit": "c2593bc14c8b0c3d3a3347d3db94ebbe3b9f399b",
      "tree": "188878dc97daed5a33a456becd42a75dbd083b2e",
      "parents": [
        "a116545aade814fab03085f6f67f0aa411b90959",
        "28699cf58187fbfb367fcb02d337e93cac9e79e4"
      ],
      "author": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Thu Oct 15 07:44:31 2026 -0700"
      },
      "committer": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Thu Oct 15 07:44:31 2026 -0700"
      },
      "message": "Merge branch \u0027pw/stash-all-parseopt-fix\u0027\n\nFix definition for the \"--all\" option to use symbolic constant\nin the options[] array passed to parse_options API.\n\n* pw/stash-all-parseopt-fix:\n  stash: use named constant when parsing \"--all\"\n"
    },
    {
      "commit": "a116545aade814fab03085f6f67f0aa411b90959",
      "tree": "1cad6efaa446ce8d5ba363dab375ca3eeb81e72a",
      "parents": [
        "0bde462668817d8575000017106d9c50ece5fb41",
        "5008bde9900db114f106e3262108ce726b879a11"
      ],
      "author": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Thu Oct 15 07:44:31 2026 -0700"
      },
      "committer": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Thu Oct 15 07:44:31 2026 -0700"
      },
      "message": "Merge branch \u0027kh/format-patch-range-diff-notes\u0027\n\nThe \u0027format-patch\u0027 command has been updated with options to\nconfigure notes specifically for range-diff output, allowing them to\ndiffer from the notes displayed on the patches themselves.\n\n* kh/format-patch-range-diff-notes:\n  format-patch: learn --[no-]range-diff-notes\n  format-patch: simplify get_notes_arg parameters\n"
    },
    {
      "commit": "0bde462668817d8575000017106d9c50ece5fb41",
      "tree": "21095048a577dfb450d9678f04f96af29aad0cb6",
      "parents": [
        "e37840933fdcb8c708d9d5a960128a4341b5991e",
        "42017ff9792f75fec560b984edcc969eecbad15c"
      ],
      "author": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Thu Oct 15 07:44:31 2026 -0700"
      },
      "committer": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Thu Oct 15 07:44:31 2026 -0700"
      },
      "message": "Merge branch \u0027kh/doc-trailers-cmd-examples\u0027\n\nThe documentation for \u0027git interpret-trailers\u0027 has been updated to\nfix the grammatical errors in the descriptions of command examples.\n\n* kh/doc-trailers-cmd-examples:\n  doc: interpret-trailers: fix cmd examples\n"
    },
    {
      "commit": "e37840933fdcb8c708d9d5a960128a4341b5991e",
      "tree": "d8d5029782ff100fab0f7b413dd767e29d0c9f66",
      "parents": [
        "605bb24465327b3692b947c21312e54c5ceb07be",
        "c5f8f607191c55e360cee8a23aa6b722e4d8dd65"
      ],
      "author": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Thu Oct 15 07:44:30 2026 -0700"
      },
      "committer": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Thu Oct 15 07:44:31 2026 -0700"
      },
      "message": "Merge branch \u0027mg/doc-remote-set-head\u0027\n\nThe documentation for \u0027git remote set-head\u0027 has been updated to\nclarify that it only modifies the local repository\u0027s remote-tracking\nsymbolic reference, and does not alter the target remote\nrepository\u0027s own \u0027HEAD\u0027.\n\n* mg/doc-remote-set-head:\n  doc: remote: say that it only affects the local repository\n"
    },
    {
      "commit": "605bb24465327b3692b947c21312e54c5ceb07be",
      "tree": "b04cce4a8f499baa939437790e39182c7c17437c",
      "parents": [
        "4e399f027c21eeb9398198101532957e289e0f20",
        "778c73948a471841b780cf220dfd37a710e51f9c"
      ],
      "author": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Thu Oct 15 07:44:30 2026 -0700"
      },
      "committer": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Thu Oct 15 07:44:30 2026 -0700"
      },
      "message": "Merge branch \u0027kz/doc-user-manual-typo\u0027\n\nA grammatically incorrect capitalization in user-manual.adoc has\nbeen corrected.\n\n* kz/doc-user-manual-typo:\n  doc: fix typo in user manual\n"
    },
    {
      "commit": "4e399f027c21eeb9398198101532957e289e0f20",
      "tree": "3d26252c17fee7078a97f2f3d7b6fe37b57cae02",
      "parents": [
        "07cc531ed3e3320d64fc8b4c1274a6f958093d2f",
        "a69a982f48a172cf9f3382e0e502ff6e1a005419"
      ],
      "author": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Thu Oct 15 07:44:30 2026 -0700"
      },
      "committer": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Thu Oct 15 07:44:30 2026 -0700"
      },
      "message": "Merge branch \u0027ps/parse-options-subcommand-groups\u0027\n\nThe parse-options API has been updated to support grouping\nsubcommands, and the \u0027git refs\u0027 command has been updated to use this\nnew feature to categorize its subcommands in its help output.\n\n* ps/parse-options-subcommand-groups:\n  builtin/refs: introduce subcommand groups\n  parse-options: allow grouping subcommands\n  parse-options: extract functions to print single option\n  parse-options: fix completion format when first option is skipped\n"
    },
    {
      "commit": "07cc531ed3e3320d64fc8b4c1274a6f958093d2f",
      "tree": "11eb2d58081f0ee910cde0c7bf59331018d6381d",
      "parents": [
        "a9bd346d8b6570a950724d4196224a493b038243",
        "72c41c3ee0bc8f0e12f21f0c55bd9d07d19f75f6"
      ],
      "author": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Thu Oct 15 07:44:30 2026 -0700"
      },
      "committer": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Thu Oct 15 07:44:30 2026 -0700"
      },
      "message": "Merge branch \u0027hn/object-name-push-short\u0027\n\nThe @{upstream} notation had short-hand @{u} from the beginning,\nand @{push} learned corresponding @{p} to match.\n\n* hn/object-name-push-short:\n  object-name: accept @{p} as short for @{push}\n"
    },
    {
      "commit": "a9bd346d8b6570a950724d4196224a493b038243",
      "tree": "ad128af4bf6c47f518cdd7be67078e3fd2188d08",
      "parents": [
        "0930ad7aab7b17273fd6274da8cdcc0a6ab8c205",
        "b837e5f4bc1577f267edfec5459babafc156d7ed"
      ],
      "author": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Thu Oct 15 07:44:30 2026 -0700"
      },
      "committer": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Thu Oct 15 07:44:30 2026 -0700"
      },
      "message": "Merge branch \u0027bc/git-contacts-stdin\u0027\n\nThe \u0027git-contacts\u0027 program (in contrib/) has been taught to read\npatches from the standard input stream when an explicit dash (\u0027-\u0027) is\npassed in place of a file.\n\n* bc/git-contacts-stdin:\n  git-contacts: allow inputting patch via stdin\n"
    },
    {
      "commit": "0930ad7aab7b17273fd6274da8cdcc0a6ab8c205",
      "tree": "a9ba057150fb36391418ecb219021f64c2b52108",
      "parents": [
        "b78604666654a2a75b2d3df2e89295e2fcbaf78e",
        "598588c15584a28c62fbb12d4f6bba57f159fbb0"
      ],
      "author": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Thu Oct 15 07:44:29 2026 -0700"
      },
      "committer": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Thu Oct 15 07:44:29 2026 -0700"
      },
      "message": "Merge branch \u0027ap/var-broken-down-idents\u0027\n\nThe \u0027git var\u0027 command has been updated to output individual components\nof the author and committer identities, take multiple keys on the\ncommand-line, and support NUL-delimited output with the \u0027-z\u0027 option.\n\n* ap/var-broken-down-idents:\n  var: add broken-out identity variables\n  var: accept more than one variable\n  var: add \"-z\" output mode\n  var: represent multi-valued variables with a string_list\n"
    },
    {
      "commit": "b78604666654a2a75b2d3df2e89295e2fcbaf78e",
      "tree": "74957e580ce0fbff1ca4acd064469a5d9ee7af5c",
      "parents": [
        "81db32ddce564ab4a4e61692bd027d239dccb266",
        "8ae4c185a6d65533d0941ca39de1b98821ba7496"
      ],
      "author": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Thu Oct 15 07:44:29 2026 -0700"
      },
      "committer": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Thu Oct 15 07:44:29 2026 -0700"
      },
      "message": "Merge branch \u0027dk/stash-apply-index-incore\u0027\n\nThe handling of index conflicts in \u0027git stash apply --index\u0027 has\nbeen optimized.  Instead of relying on expensive external\nsubprocesses using \u0027git diff-tree\u0027 and \u0027git apply\u0027, the index is now\nmerged in-core using the merge-ort machinery, which fixes a\nconcurrent lock file issue with autostash.\n\n* dk/stash-apply-index-incore:\n  builtin/stash: merge index in-core\n  t3903: test failed \"stash apply --index\"\n  stash: prepare merge options earlier\n  builtin/stash: remove unused header\n"
    },
    {
      "commit": "81db32ddce564ab4a4e61692bd027d239dccb266",
      "tree": "35a2fba99fc8134d71cbf0da1becdc2db39e6023",
      "parents": [
        "1ee477ab508d4a6bc127264aed3d6ba68cbf9a9d",
        "5b0456361d23bf6ffe9539dd6f323a02c69c14b4"
      ],
      "author": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Thu Oct 15 07:44:29 2026 -0700"
      },
      "committer": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Thu Oct 15 07:44:29 2026 -0700"
      },
      "message": "Merge branch \u0027jk/xdiff-size_t\u0027\n\nThe internal diff and merge machinery has been updated to use\nstandard size_t types rather than signed longs for buffer\nallocations and offsets, preventing subtle overflow issues on LLP64\narchitectures, and plugging uninitialized memory leaks along error\npaths.\n\n* jk/xdiff-size_t:\n  merge-ll: report an error when reading external merge results fails\n  merge-ll: handle external driver status before reading result\n  merge-ll: use read_mmfile() to read external merge results\n  xdiff: NUL-terminate buffers read by read_mmfile()\n  xdiff: use size_t for buffer sizes\n  xdiff: replace mmbuffer_t with mmfile_t\n  xdiff: clean up read_mmfile() allocations on error\n"
    },
    {
      "commit": "1ee477ab508d4a6bc127264aed3d6ba68cbf9a9d",
      "tree": "de50ab99da22b82756faa8cb53a35d6ef5026b2d",
      "parents": [
        "08ab14b084561e400a320719c53dcc3924e5e0f8",
        "e14e2b6cf2db2ebde3cb5c4d953899c5f014253e"
      ],
      "author": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Thu Oct 15 07:44:29 2026 -0700"
      },
      "committer": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Thu Oct 15 07:44:29 2026 -0700"
      },
      "message": "Merge branch \u0027ps/reftable-reflog-timezone\u0027\n\nThe internal representation of timezones in the reflog for the\nreftable format has been fixed to match the specification, which\ndictates an offset in minutes rather than the parsed \"+HHMM\" integer\nrepresentation.\n\n* ps/reftable-reflog-timezone:\n  refs/reftable: fix on-disk representation of reflog timezones\n  t/helper: fix segfault in \"dump-reftable -t\"\n  date: add helpers to convert between \"+HHMM\" timezones and minutes\n"
    },
    {
      "commit": "08ab14b084561e400a320719c53dcc3924e5e0f8",
      "tree": "14cd1b7359afd0c9395272a44883e0647eccf2a5",
      "parents": [
        "54fd0d4c5e3d69a3024720121cbe7d88b6838b68",
        "a68cca9953cf2e9ef64f355455164025bae0b188"
      ],
      "author": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Thu Oct 15 07:44:28 2026 -0700"
      },
      "committer": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Thu Oct 15 07:44:28 2026 -0700"
      },
      "message": "Merge branch \u0027tb/t5520-reflog-expire\u0027\n\nThe `t5520` test script has been updated to disable reflog expiration.\nThis prevents test flakiness caused by the auto-maintenance\nreflog-expire task, which would otherwise immediately expire the\ntest\u0027s reflogs due to them carrying hardcoded timestamps from 2005.\n\n* tb/t5520-reflog-expire:\n  t5520: don\u0027t expire reflogs where it matters\n"
    },
    {
      "commit": "54fd0d4c5e3d69a3024720121cbe7d88b6838b68",
      "tree": "344b849cbf37b68b16e400dd6998f7391fc12d03",
      "parents": [
        "1c1256682a54d6738880e11ed2edf4b36757ef6c",
        "4f956cf43ad8f57181df11506298d0f8d511d08a"
      ],
      "author": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Thu Oct 15 07:44:28 2026 -0700"
      },
      "committer": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Thu Oct 15 07:44:28 2026 -0700"
      },
      "message": "Merge branch \u0027td/ci-large-test-resources\u0027\n\nCI resource exhaustion during test runs on GitHub Actions has been\nmitigated by switching a comparison of a huge output to use a binary\ncomparison, and by capping the parallel jobs on Linux to the number\nof available CPUs.\n\n* td/ci-large-test-resources:\n  ci: use twice the CPU count on both providers\n  t4205: compare huge output without diff\n"
    },
    {
      "commit": "1c1256682a54d6738880e11ed2edf4b36757ef6c",
      "tree": "6bcf128458d4f73d49c544c29079628e3e71cf76",
      "parents": [
        "6de20f6092dcf9bdb1c8efe03db4b70c82b423dd",
        "ce4a600322fa2c302e354755f9331f04d4242edd"
      ],
      "author": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Thu Oct 15 07:44:28 2026 -0700"
      },
      "committer": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Thu Oct 15 07:44:28 2026 -0700"
      },
      "message": "Merge branch \u0027ps/meson-improvements\u0027\n\nThe build configurations for Meson have been optimized to avoid\nrecompiling HTTP sources multiple times and to utilize precompiled\nheaders for test-helpers and unit tests, reducing clean build times.\nAdditionally, the shell completion tests and GitLab CI MSVC runner\njobs have been fixed.\n\n* ps/meson-improvements:\n  gitlab-ci: fix hanging MSVC jobs\n  meson: update wrappers\n  meson: fix outdated completion helpers\n  meson: use precompiled headers for unit tests\n  meson: use precompiled headers for our test-helper\n  meson: don\u0027t recompile git-remote-http(1) multiple times for tests\n  meson: avoid recompiling HTTP sources several times\n"
    },
    {
      "commit": "60e16b0387ae9100952a789ac5fa21127cebb28a",
      "tree": "7b4f30fa84c3f7b2caafbd5badb09313e8ad71c6",
      "parents": [
        "a018953688f1b10bddf91bff8747068f5f4746a4"
      ],
      "author": {
        "name": "Okhuomon Ajayi",
        "email": "okhuomonajayi54@gmail.com",
        "time": "Tue Oct 13 21:30:42 2026 +0100"
      },
      "committer": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Tue Oct 13 13:41:18 2026 -0700"
      },
      "message": "delta-islands: use Q_() for island count\n\nThe progress message \"Marked %d islands, done.\" is marked for\ntranslation with _(), which gives translators a single form for\nevery count. It reads wrongly when only one island is marked, and\nlanguages with more than two plural forms cannot translate it\ncorrectly.\n\nUse Q_() with a singular and a plural form so the right one is\npicked from island_counter.\n\nSigned-off-by: Okhuomon Ajayi \u003cokhuomonajayi54@gmail.com\u003e\nSigned-off-by: Junio C Hamano \u003cgitster@pobox.com\u003e\n"
    },
    {
      "commit": "d5f4e42f02214b5d5af23578a4ad8de66427840d",
      "tree": "d97f79eea793f155d1782a879495190a6a648d60",
      "parents": [
        "63ea7cd6744b42aa7b62b1694c95a5823de897db"
      ],
      "author": {
        "name": "Phillip Wood",
        "email": "phillip.wood@dunelm.org.uk",
        "time": "Tue Oct 13 16:47:55 2026 +0100"
      },
      "committer": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Tue Oct 13 10:31:06 2026 -0700"
      },
      "message": "merge: remember conflict labels\n\nWhen recreating merge conflicts with \"git checkout -m \u003cpath\u003e\" the\noriginal conflict labels are lost. For commands like \"git merge\" and\n\"git cherry-pick\" we could use the presence of the related root\nref (MERGE_HEAD and CHERRY_PICK_HEAD respectively) to recreate the\nlabels. However, if the conflicts are from \"git stash pop\" or \"git\ncheckout -m \u003cbranch\u003e\", then there is no ref to deduce the labels from. To\nensure the labels are always available, the merge machinery is updated to\nwrite \".git/MERGE_LABELS\" when it updates the worktree and\nthere are conflicts. The labels are then read from that file by \"git\ncheckout -m \u003cpath\u003e\" when recreating the conflicts.\n\nAs \"git checkout -m \u003cbranch\u003e\" calls remove_branch_state() which\nordinarily removes the labels file, we need to pass a flag down\nto optionally prevent that so that the labels are available for any\nsubsequent \"git checkout -m \u003cpath\u003e\". Note that merge_switch_to_result()\nwe assign \"result-\u003epriv\" to \"opt-\u003epriv\" and later clear \"opt-\u003epriv\" in\norder to get a pointer to the private struct as result-\u003epriv is void*.\n\nSigned-off-by: Phillip Wood \u003cphillip.wood@dunelm.org.uk\u003e\nSigned-off-by: Junio C Hamano \u003cgitster@pobox.com\u003e\n"
    },
    {
      "commit": "63ea7cd6744b42aa7b62b1694c95a5823de897db",
      "tree": "ffe5c2b41cfd3cc239f61efd5b36b79171752ede",
      "parents": [
        "ac6889a969aa928ae3e8a85be5327b8fa42f4f8e"
      ],
      "author": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Tue Oct 13 16:47:54 2026 +0100"
      },
      "committer": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Tue Oct 13 10:31:06 2026 -0700"
      },
      "message": "checkout -m \u003cpath\u003e: cache merge settings\n\nLookup the conflict style and normalization config settings once and\ncache the results, rather than looking up the same data for every path\nthat is being merged. While looking up the config settings each time is\nfairly inexpensive, the next commit will start reading the conflict\nlabels to use from a file and we want to avoid doing that more than\nonce.\n\nSigned-off-by: Junio C Hamano \u003cgitster@pobox.com\u003e\nSigned-off-by: Phillip Wood \u003cphillip.wood@dunelm.org.uk\u003e\nSigned-off-by: Junio C Hamano \u003cgitster@pobox.com\u003e\n"
    },
    {
      "commit": "ac6889a969aa928ae3e8a85be5327b8fa42f4f8e",
      "tree": "4f5a3143990372775a6839a89ac62cd324c92e69",
      "parents": [
        "a018953688f1b10bddf91bff8747068f5f4746a4"
      ],
      "author": {
        "name": "Phillip Wood",
        "email": "phillip.wood@dunelm.org.uk",
        "time": "Tue Oct 13 16:47:53 2026 +0100"
      },
      "committer": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Tue Oct 13 10:31:06 2026 -0700"
      },
      "message": "remove_branch_state: convert boolean argument to flags\n\nConvert the \"verbose\" boolean argument to a flag so that we can add\nmore flags in a future commit.\n\nSigned-off-by: Phillip Wood \u003cphillip.wood@dunelm.org.uk\u003e\nSigned-off-by: Junio C Hamano \u003cgitster@pobox.com\u003e\n"
    },
    {
      "commit": "01de14365ddfb37ec0745bd4661c469e9ba6a684",
      "tree": "00077ebafeaf5d00032dfe2a0fdfd0ce037fd1cb",
      "parents": [
        "a018953688f1b10bddf91bff8747068f5f4746a4"
      ],
      "author": {
        "name": "Beat Bolli",
        "email": "dev+git@drbeat.li",
        "time": "Mon Oct 12 23:04:50 2026 +0200"
      },
      "committer": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Mon Oct 12 14:18:13 2026 -0700"
      },
      "message": "unicode: update the width tables to Unicode 18\n\nUnicode 18 has been announced on 2026-09-16 [0], so update the character\nwidth tables to the new version.\n\n[0] https://blog.unicode.org/2026/09/announcing-unicode-standard-version-180.html\n\nSigned-off-by: Beat Bolli \u003cdev+git@drbeat.li\u003e\nSigned-off-by: Junio C Hamano \u003cgitster@pobox.com\u003e\n"
    },
    {
      "commit": "b6d18b5d68a0c8682b53c5e18d9c58421356e2c7",
      "tree": "be3d28a148cac634d6e1c902470867716ef457dd",
      "parents": [
        "a018953688f1b10bddf91bff8747068f5f4746a4"
      ],
      "author": {
        "name": "Julia Evans",
        "email": "julia@jvns.ca",
        "time": "Fri Oct 09 15:13:43 2026 +0000"
      },
      "committer": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Fri Oct 09 11:38:42 2026 -0700"
      },
      "message": "status: suggest `git merge --continue`, not `git commit`\n\nDuring a merge conflict, we suggest using --continue to continue the\nmerge for rebase, revert, and cherry-pick.\n\nChange the `git merge` advice to be consistent. 367ff69428\n(merge: add \u0027--continue\u0027 option as a synonym for \u0027git commit\u0027, 2016-12-14)\nsays that `git merge --continue` is intended to be a synonym for\n`git commit`, and the `git merge` man page already suggests to use\n`git merge --continue`.\n\nSigned-off-by: Julia Evans \u003cjulia@jvns.ca\u003e\nAcked-by: Phillip Wood \u003cphillip.wood123@gmail.com\u003e\nSigned-off-by: Junio C Hamano \u003cgitster@pobox.com\u003e\n"
    },
    {
      "commit": "b1be790f3871c400269fc576cf0002650e636d5a",
      "tree": "f4ea756502c2c67dcf03afc7605434afac3ffb7d",
      "parents": [
        "a018953688f1b10bddf91bff8747068f5f4746a4"
      ],
      "author": {
        "name": "Harald Nordgren",
        "email": "haraldnordgren@gmail.com",
        "time": "Thu Oct 08 09:07:45 2026 +0000"
      },
      "committer": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Thu Oct 08 12:30:11 2026 -0700"
      },
      "message": "t7004: check a missing key without deleting gpghome\n\nThe \"verify signed tag fails when public key is not present\" test\ndeletes gpghome to lose the key, and this sometimes fails on Alpine\nwith\n\n    rm: can\u0027t remove \u0027gpghome/S.gpg-agent.extra\u0027: No such file or directory\n\nPoint GNUPGHOME at an unused directory for the verification, which is\nhow t7510 checks a signature whose key is unknown.\n\nSigned-off-by: Harald Nordgren \u003charaldnordgren@gmail.com\u003e\nSigned-off-by: Junio C Hamano \u003cgitster@pobox.com\u003e\n"
    },
    {
      "commit": "0ba59c845312f5b098b4ab27ae2f60988954d7b5",
      "tree": "18df99899728475e9e9f79f55bce61cca0fbeb7a",
      "parents": [
        "cbfd4cb86f78054a0b824b86f058240c162612e0"
      ],
      "author": {
        "name": "Patrick Steinhardt",
        "email": "ps@pks.im",
        "time": "Thu Oct 08 10:36:03 2026 +0200"
      },
      "committer": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Thu Oct 08 07:31:20 2026 -0700"
      },
      "message": "odb/source: drop `read_alternates` callback\n\nNow that alternates are an implementation detail of the \"files\" backend\nthere is no reason anymore to expose them anywhere else. The callback to\nread alternates is thus no longer required. Remove it.\n\nSigned-off-by: Patrick Steinhardt \u003cps@pks.im\u003e\nSigned-off-by: Junio C Hamano \u003cgitster@pobox.com\u003e\n"
    },
    {
      "commit": "cbfd4cb86f78054a0b824b86f058240c162612e0",
      "tree": "90f5775b5fd250f7afc90fbdeb0a02d8bbed74f3",
      "parents": [
        "c96b05a9c26b5edb3e8c1b9491b386ddc70035f8"
      ],
      "author": {
        "name": "Patrick Steinhardt",
        "email": "ps@pks.im",
        "time": "Thu Oct 08 10:36:02 2026 +0200"
      },
      "committer": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Thu Oct 08 07:31:19 2026 -0700"
      },
      "message": "odb/source-files: move alternates into the backend\n\nOriginally, when designing pluggable object databases the goal was that\nthe object database can have multiple sources, and every source attached\nto it could use a different backend. This would have allowed for quite a\nlot of flexibility, as you could trivially mix and match different kinds\nof object storages in whatever way you like.\n\nBut while well-intentioned, this design led to a bunch of conceptual\nproblems:\n\n  - We\u0027re now trying to read objects in source order, whereas we\n    previously tried to read objects via packfiles before trying to read\n    them via loose objects. This led to a performance regression when\n    using alternates or when using a quarantine directory.\n\n  - Some data structures are supposed to only ever exist once, like for\n    example bitmaps and commit graphs. At the same time, those data\n    structures also span across the union of all objects, so they may\n    cross sources.\n\n  - It is unclear how we can extend GIT_OBJECT_DIRECTORY or\n    GIT_ALTERNATE_OBJECT_DIRECTORIES to become backend-agnostic in a\n    backwards-compatible way. In general, introducing an object storage\n    extension into the current status quo where alternates may have to\n    be extended to become generic was proving to be painful.\n\n  - Some mechanisms of alternates assume way too much about how exactly\n    their backends work. Alternate refs for example assume that the\n    alternate is backed by a filesystem path, and that this filesystem\n    path may also allow us to read references. This is not a given\n    though, as backends may not even have local data at all.\n\nIn short, there are a bunch of conceptual mismatches when we have\nalternates and pluggable object databases coexist. So while the original\nidea was nice, it does not result in a system that is easy to reason\nabout.\n\nCorrect course by moving alternates into the \"files\" source itself so\nthat it becomes an implementation detail thereof so that we can avoid\nall of these shortcomings. While it\u0027s unfortunate that we cannot easily\nmix and match sources now, that ability doesn\u0027t go away. It\u0027s still very\nmuch feasible to introduce a new backend that allows for exactly that\nuse case, and such a backend may also be a lot more flexible as we can\nnow add new logic to determine which objects should be stored where. So\nthe original motivation for having per-source backends can still be\nrealized with the new architecture.\n\nNote that as part of this move, we also handle the GIT_OBJECT_DIRECTORY\nand GIT_ALTERNATE_OBJECT_DIRECTORIES environment variables in the\n\"files\" backend. This may be surprising at first, but object directories\nare very much a concept of that backend, too. So these variables would\nhave bad interactions with other backends, and they create a bit of a\nmismatch with the eventual object storage extension that we plan to\nintroduce.\n\nNote that this commit is way larger than I\u0027d like it to be. I\u0027m sorry, I\ncouldn\u0027t find a way to split it up further. That being said, most of the\nchanges are straight-forward conversions that go from iterating over\nsources to iterating over object directories. The more involved changes\nare moving the infrastructure to track individual sources from \"odb.c\"\nand moving them into \"odb/source-files.c\".\n\nThis also serves to show a bit of a who\u0027s-who of commands that don\u0027t\nwork properly with pluggable object databases. Almost all of these\ncommands are related to housekeeping though -- some of them will be\nconverted eventually, like for example commit graphs or MIDXs. But many\nof them will stay incompatible going forward as they are simply too\nspecific to the \"files\" backend.\n\nSigned-off-by: Patrick Steinhardt \u003cps@pks.im\u003e\nSigned-off-by: Junio C Hamano \u003cgitster@pobox.com\u003e\n"
    },
    {
      "commit": "c96b05a9c26b5edb3e8c1b9491b386ddc70035f8",
      "tree": "5a9a98d66d2755cc7545fdcdc7ca19a5930c500f",
      "parents": [
        "6066be88b4a311cb3134d51f43db4ea10d08da2b"
      ],
      "author": {
        "name": "Patrick Steinhardt",
        "email": "ps@pks.im",
        "time": "Thu Oct 08 10:36:01 2026 +0200"
      },
      "committer": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Thu Oct 08 07:31:19 2026 -0700"
      },
      "message": "odb/source-files: extract reading alternates\n\nIn the next commit we\u0027ll add a new callsite that wants to read\nalternates without having a proper object database source for a given\nalternate available to it. Prepare for this by extracting the logic into\na separate function that only requires an object directory path as\ninput.\n\nSigned-off-by: Patrick Steinhardt \u003cps@pks.im\u003e\nSigned-off-by: Junio C Hamano \u003cgitster@pobox.com\u003e\n"
    },
    {
      "commit": "6066be88b4a311cb3134d51f43db4ea10d08da2b",
      "tree": "b7a3705a9b5407b6a43ab2f0f9b3e3b5464f9cc0",
      "parents": [
        "a26ff4e576de7478e2fefd938bcc57951a2ffb0a"
      ],
      "author": {
        "name": "Patrick Steinhardt",
        "email": "ps@pks.im",
        "time": "Thu Oct 08 10:36:00 2026 +0200"
      },
      "committer": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Thu Oct 08 07:31:19 2026 -0700"
      },
      "message": "odb/source: make `will_destroy` an implementation detail\n\nThe `struct odb_source::will_destroy` flag tracks whether a source is\npart of a transaction that we know we\u0027ll destruct anyway. If so, the\nbackend can optimize for that particular case, for example by not\nflushing any data to disk.\n\nWhile the intent is sensible, it assumes that transactions are backed by\na separate source that\u0027s being linked into the object database. But that\nmay or may not be true, as backends may have significantly better ways\nto achieve the same. So the assumption doesn\u0027t make much sense in the\nfirst place, as we\u0027re now tracking backend-specific details on the\ngeneric `struct odb_source` level.\n\nMove the field from the generic source into the \"loose\" source, as this\nis the only source that ever makes use of it anyway.\n\nSigned-off-by: Patrick Steinhardt \u003cps@pks.im\u003e\nSigned-off-by: Junio C Hamano \u003cgitster@pobox.com\u003e\n"
    },
    {
      "commit": "a26ff4e576de7478e2fefd938bcc57951a2ffb0a",
      "tree": "1ef69709088ed308a868f55df5c78eb76c307cb8",
      "parents": [
        "622a625abb97c8f3df091fde6a655950386c1cea"
      ],
      "author": {
        "name": "Patrick Steinhardt",
        "email": "ps@pks.im",
        "time": "Thu Oct 08 10:35:59 2026 +0200"
      },
      "committer": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Thu Oct 08 07:31:19 2026 -0700"
      },
      "message": "tmp-objdir: replace primary source at creation time\n\nWhen creating transactions via the \"tmp-objdir\" subsystem callers are\nexpected to first call `tmp_objdir_create()` to create the quarantine\ndirectory and then `tmp_objdir_replace_primary_odb()` to activate that\nquarantine directory as the primary object database source so that all\nnewly written objects are written into it.\n\nThis dance is performed by all users of temporary object directories, so\nthat makes the setup unnecessarily involved. Merge the logic to replace\nthe primary object database source into `tmp_objdir_create()` to\nsimplify the dance.\n\nNote that with the quarantine directory being installed by\n`tmp_objdir_create()`, users of this function no longer get a pointer to\nthe underlying quarantine directory. So instead of repreparing only that\ndirectory, we now reprepare the whole source instead, and as we know\nthat the source has wired up the quarantine directory already, this will\ncause us to reprepare the quarantine directory, too.\n\nSigned-off-by: Patrick Steinhardt \u003cps@pks.im\u003e\nSigned-off-by: Junio C Hamano \u003cgitster@pobox.com\u003e\n"
    },
    {
      "commit": "622a625abb97c8f3df091fde6a655950386c1cea",
      "tree": "6efc7fbba5ad5bef059fcaee07453cfca75a67d8",
      "parents": [
        "f80a79e23345c647209c33701df0e608696325ae"
      ],
      "author": {
        "name": "Patrick Steinhardt",
        "email": "ps@pks.im",
        "time": "Thu Oct 08 10:35:58 2026 +0200"
      },
      "committer": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Thu Oct 08 07:31:19 2026 -0700"
      },
      "message": "tmp-objdir: manage quarantine as an object directory\n\nWhen creating a quarantine directory via the \"tmp-objdir\" subsystem we\ncreate a new \"files\" backend that new objects part of the transaction\ncan be written to. In a future commit though we\u0027ll move handling of\nalternates into the \"files\" backend, and as part of that it will no\nlonger be possible for us to have multiple sources attached to a single\nobject database.\n\nIn a preceding commit, we have prepared the \"files\" backend to be able\nto handle multiple object directories. We don\u0027t use that mechanism for\nalternates yet, but will start doing so in a subsequent commit. But with\nthat infrastructure ready we can already migrate tmp-objdirs over to use\nthis new mechanism.\n\nAdapt the subsystem so we create a `struct odb_files_dir` instead of a\nnew \"files\" source.\n\nSigned-off-by: Patrick Steinhardt \u003cps@pks.im\u003e\nSigned-off-by: Junio C Hamano \u003cgitster@pobox.com\u003e\n"
    },
    {
      "commit": "f80a79e23345c647209c33701df0e608696325ae",
      "tree": "4f9b9aab906c555cc5ce67aa866bd78b10b0bde4",
      "parents": [
        "5c869c96a4e4d9f494699e69f06fff9e68f0b5ba"
      ],
      "author": {
        "name": "Patrick Steinhardt",
        "email": "ps@pks.im",
        "time": "Thu Oct 08 10:35:57 2026 +0200"
      },
      "committer": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Thu Oct 08 07:31:19 2026 -0700"
      },
      "message": "tmp-objdir: absorb logic to set and restore primary sources\n\nThe functions `odb_set_temporary_primary_source()` and\n`odb_restore_primary_source()` can be used to adapt the primary object\ndatabase source. Nowadays though we only have a single user of this\nsubsystem left, which is the \"tmp-objdir\" subsystem.\n\nDespite that, this functionality is also becoming less useful overall as\nalternates are becoming an implementation detail of the \"files\" backend.\nAnd with that change, there will only ever be a single source attached\nto the object database anyway.\n\nMove the logic into the \"tmp-objdir\" subsystem accordingly.\n\nSigned-off-by: Patrick Steinhardt \u003cps@pks.im\u003e\nSigned-off-by: Junio C Hamano \u003cgitster@pobox.com\u003e\n"
    },
    {
      "commit": "5c869c96a4e4d9f494699e69f06fff9e68f0b5ba",
      "tree": "bbacc2bf94ff82eb2d6e995f6da62bdb4572744c",
      "parents": [
        "4a9e8cab7db78eace06ecb86b5932dbd48a933c7"
      ],
      "author": {
        "name": "Patrick Steinhardt",
        "email": "ps@pks.im",
        "time": "Thu Oct 08 10:35:56 2026 +0200"
      },
      "committer": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Thu Oct 08 07:31:19 2026 -0700"
      },
      "message": "odb/source-files: add the ability to have multiple object dirs\n\nIn a subsequent commit we\u0027ll migrate handling of alternates into the\n\"files\" backend. As part of that, the backend will need to grow the\nability to handle multiple object directories for alternates and for\ntransactions.\n\nIntroduce a `struct odb_files_dir::next` pointer so that we can have\nmultiple directories. Adapt the backend to loop through this list as\nnecessary. In general:\n\n  - For reading paths we will loop through all object directories until\n    we have found the object.\n\n  - For writing paths we will typically write to the first of our object\n    directories.\n\nThis mechanism isn\u0027t used yet as we still only ever have a single object\ndirectory at the current point in time. But that will change over\nsubsequent commits.\n\nSigned-off-by: Patrick Steinhardt \u003cps@pks.im\u003e\nSigned-off-by: Junio C Hamano \u003cgitster@pobox.com\u003e\n"
    },
    {
      "commit": "4a9e8cab7db78eace06ecb86b5932dbd48a933c7",
      "tree": "999132b2233dded197ec4a000b6ec149d04b5621",
      "parents": [
        "8db128e611a7a9fa8e47f383e31128cc4a47ceb7"
      ],
      "author": {
        "name": "Patrick Steinhardt",
        "email": "ps@pks.im",
        "time": "Thu Oct 08 10:35:55 2026 +0200"
      },
      "committer": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Thu Oct 08 07:31:19 2026 -0700"
      },
      "message": "odb: refactor `odb_find_source()` to yield dirs\n\nSimilar as in the preceding commit, `odb_find_source()` can be used to\nyield a single source by its object directory. This function is also\nspecific to the \"files\" backend once alternates are an implementation\ndetail thereof.\n\nRefactor it to be specific to the \"files\" backend and return an `struct\nodb_files_dir` to prepare for moving alternates into the \"files\" source.\n\nSigned-off-by: Patrick Steinhardt \u003cps@pks.im\u003e\nSigned-off-by: Junio C Hamano \u003cgitster@pobox.com\u003e\n"
    },
    {
      "commit": "8db128e611a7a9fa8e47f383e31128cc4a47ceb7",
      "tree": "10648f02363793de867384c3926006f0a3ae6a62",
      "parents": [
        "45b1324139d0428348a15ac09fd58f47f9435476"
      ],
      "author": {
        "name": "Patrick Steinhardt",
        "email": "ps@pks.im",
        "time": "Thu Oct 08 10:35:54 2026 +0200"
      },
      "committer": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Thu Oct 08 07:31:19 2026 -0700"
      },
      "message": "odb: refactor `odb_for_each_alternate()` to yield dirs\n\nThe function `odb_for_each_alternate()` iterates through all alternates\nof an object database. This is becoming an implementation detail of the\n\"files\" backend though, where each alternate will be represented by one\n`struct odb_files_dir`.\n\nAdapt `odb_for_each_alternate()` to already iterate through these\nstructs instead of iterating through sources.\n\nSigned-off-by: Patrick Steinhardt \u003cps@pks.im\u003e\nSigned-off-by: Junio C Hamano \u003cgitster@pobox.com\u003e\n"
    },
    {
      "commit": "45b1324139d0428348a15ac09fd58f47f9435476",
      "tree": "885893f81013634f1e599efb8f505b14263b2294",
      "parents": [
        "623d2c71255977544086c9be76dfeff43cdbaf88"
      ],
      "author": {
        "name": "Patrick Steinhardt",
        "email": "ps@pks.im",
        "time": "Thu Oct 08 10:35:53 2026 +0200"
      },
      "committer": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Thu Oct 08 07:31:18 2026 -0700"
      },
      "message": "odb/source-files: introduce `struct odb_files_dir`\n\nThe \"files\" object database source consists of two separate backends for\nstoring loose and packed objects. These are managed as somewhat separate\nentities even though they derive from the same object directory, whether\nit\u0027s the primary object directory or that one from an alternate.\n\nIn a subsequent commit we\u0027ll move the handling of alternates into the\n\"files\" backend completely so that it becomes another implementation\ndetail thereof. As part of this, we\u0027ll want to keep track of both of\nthese sub-sources as a single entity derived from their respective\nobject directory.\n\nPrepare for this change by introducing a new `struct odb_files_dir` that\nencapsulates them. For now, every \"files\" source has exactly one such\ndirectory. In a subsequent commit though, we\u0027ll make it a linked list of\ndirectories so that we can manage multiple such directories in a single\n\"files\" source.\n\nSigned-off-by: Patrick Steinhardt \u003cps@pks.im\u003e\nSigned-off-by: Junio C Hamano \u003cgitster@pobox.com\u003e\n"
    },
    {
      "commit": "623d2c71255977544086c9be76dfeff43cdbaf88",
      "tree": "7e0ec75efceca82a585a50e6b33a507d86c06c95",
      "parents": [
        "778d260c316b9c72b06ad5edcb5535e7ee4a7804"
      ],
      "author": {
        "name": "Patrick Steinhardt",
        "email": "ps@pks.im",
        "time": "Thu Oct 08 10:35:52 2026 +0200"
      },
      "committer": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Thu Oct 08 07:31:18 2026 -0700"
      },
      "message": "commit-graph: stop depending on `struct odb_source`\n\nTo read or write a commit graph we require access to the repository that\nthe graph should be read from or written for as well as the object\ndirectory to derive its location. Instead of passing in these two bits\nof information explicitly though, we pass in a `struct odb_source`,\nwhich carries with it both of these pieces of information.\n\nBut ultimately, this is somewhat flawed as we now assume that the source\neven has an on-disk representation, and furthermore we assume that the\ncommit graphs would live in \".git/objects/info\". This is true for the\n\"files\" backend, but it\u0027s not necessarily true for any other backend\nthat we may eventually want to introduce. So eventually, we\u0027ll want to\nevolve the commit-graph subsystem to become agnostic of the backend\u0027s\nlayout and let the backend itself decide where to read a commit graph\nfrom or where to write it to.\n\nWe\u0027re not there yet to do that switch, but the current design is already\ncausing issues for the intent of this patch series where we want to move\nalternates into the \"files\" backend.\n\nConvert the subsystem to take a repository plus an object directory path\ninstead. This unblocks moving around alternates, and it\u0027s also a step\nin the right direction for moving commit graphs into the source in a\nlater series.\n\nNote that we previously compared the `struct odb_source` pointers of two\ncommit graphs to figure out whether they were located in the same object\ndirectory, whereas we now have to compare their paths. Callers may pass\nin those paths in different forms though, for example relative to the\ncurrent working directory or as absolute paths. Convert the object\ndirectory into an absolute path both when loading and when writing\ncommit graphs so that the comparisons become more robust.\n\nSigned-off-by: Patrick Steinhardt \u003cps@pks.im\u003e\nSigned-off-by: Junio C Hamano \u003cgitster@pobox.com\u003e\n"
    },
    {
      "commit": "778d260c316b9c72b06ad5edcb5535e7ee4a7804",
      "tree": "1d4475ac41232a1ccbe5d1e4712eac795e0984d1",
      "parents": [
        "c46c1e37724f0478939de636ab8ea5a89086d532"
      ],
      "author": {
        "name": "Patrick Steinhardt",
        "email": "ps@pks.im",
        "time": "Thu Oct 08 10:35:51 2026 +0200"
      },
      "committer": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Thu Oct 08 07:31:18 2026 -0700"
      },
      "message": "commit-graph: require resolved packfile paths for `stdin_packs`\n\nUsers can ask git-commit-graph(1) to write a commit graph specifically\nfor a set of packfiles via the \"--stdin-packs\" option. Those users are\nexpected to pass in relative paths, and those eventually get resolved in\n`fill_oids_from_packs()`. This ties the logic in \"commit-graph.c\" to the\nspecific object database source, as the subsystem now needs to assume\nwhere a specific packfile is located relative to the source itself.\n\nRefactor the logic to instead require the caller to pass in resolved\npackfiles to untangle that dependency. This also makes the next change\neasier to implement, where we\u0027ll get rid of passing the source to the\ncommit-graph subsystem.\n\nSigned-off-by: Patrick Steinhardt \u003cps@pks.im\u003e\nSigned-off-by: Junio C Hamano \u003cgitster@pobox.com\u003e\n"
    },
    {
      "commit": "cef2d8c4cbca930c4f57e81739fe1663be7ab18d",
      "tree": "3bcd7e6d904cb858824f1f806f911615359f730e",
      "parents": [
        "72e75ffee70f2e898ae687734aa109f559b39e5c"
      ],
      "author": {
        "name": "Kristofer Karlsson",
        "email": "krka@spotify.com",
        "time": "Wed Oct 07 14:22:57 2026 +0000"
      },
      "committer": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Wed Oct 07 09:50:48 2026 -0700"
      },
      "message": "fetch: write commit-graph using updated refs only\n\nWhen fetch.writeCommitGraph was introduced in 50f26bd035 (fetch: add\nfetch.writeCommitGraph config setting, 2019-09-02), the stated goal\nwas to stay updated with the latest commits after fetching new\nobjects.  The implementation used write_commit_graph_reachable()\nbecause it was the only API available, but two things have changed\nsince then:\n\n 1. write_commit_graph() was added, and it accepts an explicit set of\n    commits as seeds, enabling more targeted commit-graph updates.\n\n 2. The ref-scanning callback add_ref_to_set() became more expensive\n    in 630cd5194e (commit-graph.c: peel refs in \u0027add_ref_to_set\u0027,\n    2020-07-22) when it started to validate the refs against the odb\n    for correctness.  On a repository with many refs, this makes the\n    full reachable scan unnecessarily costly for a targeted fetch.\n\nOptimize the commit-graph write by using only the newly updated refs\nas seeds instead of scanning all refs after every fetch.  To keep\nthis change small, skip the optimization for multi-remote fetches\n(since that would require propagating the set of refs across process\nboundaries).\n\nThis relies on the commit-graph write being additive, keeping the\ncommits that are already in the graph.  fetch already operates in\nthis mode (COMMIT_GRAPH_WRITE_SPLIT) and now that becomes\nrequired for correctness.  Without that mode, the write would\nreplace the commit-graph and lose other commits.\n\nAfter fetch_one() returns, call prepare_commit_graph() (which is\nmade non-static by this commit) to determine the graph-write mode:\n\n - If no commit-graph exists yet, fall back to the full reachable\n   scan so the first graph creation covers all refs.\n\n - If a commit-graph exists and the fetch updated at least one ref,\n   write incrementally using only the new refs as seeds.\n\n - If a commit-graph exists but the fetch is a no-op, skip the\n   commit-graph write entirely.\n\n - For the multi-remote path (fetch --all), where child processes\n   do the actual fetching, fall back to the full reachable scan.\n\nFull commit-graph coverage of all refs remains the responsibility\nof \"git maintenance\", \"git gc\" and \"git commit-graph write\".\nRegular Git operations may trigger \"git maintenance run --auto\",\nwhich periodically rebuilds the commit-graph from all reachable\nrefs.\n\nThe effect was measured on a synthetic setup: git.git with 200K\nextra packed refs (~206K total), a local file:// remote, an existing\nsplit commit-graph and a warm page cache.  The times below are the\nmedian of 9 runs of the trace2 region fetch/write-commit-graph:\n\n    scenario          before    after\n    no-op fetch       380 ms    (skipped)\n    1 ref updated     357 ms    9.3 ms\n    10 refs updated   359 ms    8.9 ms\n\nSigned-off-by: Kristofer Karlsson \u003ckrka@spotify.com\u003e\nSigned-off-by: Junio C Hamano \u003cgitster@pobox.com\u003e\n"
    },
    {
      "commit": "72e75ffee70f2e898ae687734aa109f559b39e5c",
      "tree": "827f561de015d8fc02072edf463dc445711af6c3",
      "parents": [
        "a018953688f1b10bddf91bff8747068f5f4746a4"
      ],
      "author": {
        "name": "Kristofer Karlsson",
        "email": "krka@spotify.com",
        "time": "Wed Oct 07 14:22:56 2026 +0000"
      },
      "committer": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Wed Oct 07 09:50:48 2026 -0700"
      },
      "message": "test-tool read-graph: add commit-info subcommand\n\nThe test infrastructure has no way to check whether a specific commit\nis present in the commit-graph, making it hard to verify graph state\nafter operations like fetch.\n\nAdd a \"commit-info\" subcommand to test-tool read-graph that queries\nwhether specific commits are present in the commit-graph and prints\ntheir generation numbers.  Returns 1 if any commit is not found.\n\nSigned-off-by: Kristofer Karlsson \u003ckrka@spotify.com\u003e\nSigned-off-by: Junio C Hamano \u003cgitster@pobox.com\u003e\n"
    },
    {
      "commit": "a61035fab9299de25ef46bbaedccd08734ce66c9",
      "tree": "b2b5c4a55fafc6ede4d9f2f7b79bc421c5dfcb62",
      "parents": [
        "a018953688f1b10bddf91bff8747068f5f4746a4"
      ],
      "author": {
        "name": "Karthik Nayak",
        "email": "karthik.188@gmail.com",
        "time": "Wed Oct 07 13:20:16 2026 +0200"
      },
      "committer": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Wed Oct 07 07:13:41 2026 -0700"
      },
      "message": "packed-refs: use `fwrite()` when passing refs verbatim\n\nThe `write_with_updates()` function uses a `struct ref_iterator` to\niterate over all refs to write to the temporary packed-refs file. It\nreceives the iterator from `packed_ref_iterator_begin()` which takes a\nsnapshot of the \u0027packed-refs\u0027 file.\n\nWhile writing to the new packed-refs file, writes are routed via\n`write_packed_entry()` which uses `fprintf()`. Even for references which\nhaven\u0027t changed, we use the same mechanism. This is slow since we need\nto do string parsing and formatting. Instead, let\u0027s track the position\nof unchanged references in the snapshot iterator and directly write\nverbatim via `fwrite()`.\n\nWith this, any sanitization which was happening as a side effect of\nreformatting is now lost. But that was never the job of this section of\nthe code, since the main intention is to simply rewrite the remaining\nrefs post deletion of the selective few.\n\nThis removes the unnecessary formatting operation involved. We can see a\nconsistent ~20% performance improvement when deleting from packed\nreferences.\n\nBenchmark 1: update-ref: delete ref (refcount \u003d 100000, revision \u003d master)\n  Time (mean ± σ):      28.7 ms ±   1.7 ms    [User: 22.5 ms, System: 5.9 ms]\n  Range (min … max):    26.7 ms …  33.3 ms    46 runs\n\nBenchmark 2: update-ref: delete ref (refcount \u003d 100000, revision \u003d b4/kn-speedup-packed-refs)\n  Time (mean ± σ):      23.8 ms ±   1.2 ms    [User: 17.5 ms, System: 6.0 ms]\n  Range (min … max):    22.1 ms …  27.7 ms    56 runs\n\nSummary\n  update-ref: delete ref (refcount \u003d 100000, revision \u003d b4/kn-speedup-packed-refs) ran\n    1.21 ± 0.09 times faster than update-ref: delete ref (refcount \u003d 100000, revision \u003d master)\n\nSigned-off-by: Karthik Nayak \u003ckarthik.188@gmail.com\u003e\nSigned-off-by: Junio C Hamano \u003cgitster@pobox.com\u003e\n"
    },
    {
      "commit": "49e646f1c9a2f130690b92773fe3c2095dcbbacb",
      "tree": "3fc9b0ebedc04f9893f94a0edae65c6f04b31f82",
      "parents": [
        "a018953688f1b10bddf91bff8747068f5f4746a4"
      ],
      "author": {
        "name": "D. Ben Knoble",
        "email": "ben.knoble@gmail.com",
        "time": "Tue Oct 06 13:17:19 2026 -0400"
      },
      "committer": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Tue Oct 06 14:46:05 2026 -0700"
      },
      "message": "doc: fix shattered.io link\n\nSince we published this document the domain has been taken over and no\nlonger reflects the original content. Link to the last good Web Archive\nsnapshot so folks can still retrieve the SHAttered information.\n\nSuggested-by: Mae Eckert \u003cmae.eckert@albellus.de\u003e\nSigned-off-by: D. Ben Knoble \u003cben.knoble@gmail.com\u003e\nSigned-off-by: Junio C Hamano \u003cgitster@pobox.com\u003e\n"
    },
    {
      "commit": "fbbc33935a25cef04374de911b7b9f73e6e8c70c",
      "tree": "33730bd75e48349853e144bf784e2a5adcfd0e49",
      "parents": [
        "a018953688f1b10bddf91bff8747068f5f4746a4"
      ],
      "author": {
        "name": "Julia Evans",
        "email": "julia@jvns.ca",
        "time": "Tue Oct 06 16:54:30 2026 +0000"
      },
      "committer": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Tue Oct 06 13:01:19 2026 -0700"
      },
      "message": "doc: don\u0027t require a SYNOPSIS in section 7\n\nRemove the SYNOPSIS section from the section 7 man pages where\nappropriate, to avoid having a section that contains no information.\nIt\u0027s not the norm in section 7 to always require a SYNOPSIS.\n\nUpdate the perl script with a special case for section 7.\n\nTested by running `make lint-docs`, and looked at the renaming synopses\nwith this fish script snippet:\n\nfor i in *.7\n   echo $i; grep SYNOPSIS -A 5 (string replace .7 .adoc $i)\nend\n\nCo-authored-by: Tuomas Ahola \u003ctaahol@utu.fi\u003e\nSigned-off-by: Tuomas Ahola \u003ctaahol@utu.fi\u003e\nSigned-off-by: Julia Evans \u003cjulia@jvns.ca\u003e\nSigned-off-by: Junio C Hamano \u003cgitster@pobox.com\u003e\n"
    },
    {
      "commit": "6faaf59b8b977c263ab534c5b33ac4768d68b565",
      "tree": "3e73fad2aa99dc811d66c601911190f33951584c",
      "parents": [
        "a018953688f1b10bddf91bff8747068f5f4746a4"
      ],
      "author": {
        "name": "Muhammed Dilshad A",
        "email": "dilsheddilu123@gmail.com",
        "time": "Tue Oct 06 15:44:58 2026 +0530"
      },
      "committer": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Tue Oct 06 12:12:13 2026 -0700"
      },
      "message": "t0450: use test_path_is_file and test_path_is_missing\n\nReplace raw \u0027test -f\u0027 and \u0027! test -f\u0027 assertions with the test helper\nfunctions \u0027test_path_is_file\u0027 and \u0027test_path_is_missing\u0027 to provide\ndiagnostic output when an assertion fails.\n\nSigned-off-by: Muhammed Dilshad A \u003cdilsheddilu123@gmail.com\u003e\nSigned-off-by: Junio C Hamano \u003cgitster@pobox.com\u003e\n"
    },
    {
      "commit": "e2d64bd041a7836e25eca884a48932133ed51b8d",
      "tree": "8015f615be47c8b3366cf9e634ace79dd34f3aa4",
      "parents": [
        "64172cf117bd00f0caee5e6e0ab7de30aab587f4"
      ],
      "author": {
        "name": "Jeff King",
        "email": "peff@peff.net",
        "time": "Mon Oct 05 23:43:31 2026 -0400"
      },
      "committer": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Tue Oct 06 10:37:47 2026 -0700"
      },
      "message": "t5551: fix quoting in curl version bug prereq\n\nWe have a prereq snippet that invokes awk. The awk script\u0027s $1, etc,\nvariables need to be quoted to avoid shell interpolation. We correctly\nuse a single-quote inside the prereq snippet, but the snippet itself is\ncontained in double-quotes. So we interpolate \"$1\" into whatever value\nthat happens to have in the outer shell, and eval nonsense like:\n\n  awk \u0027(--some-garbage \u003d\u003d 7 \u0026\u0026 --other-garbage \u003e\u003d 88) ...\u0027\n\nAs a result, we don\u0027t think we have a buggy curl version even when we\ndo, and run the test anyway. But of course it\u0027s easy not to notice,\nsince this prereq was protecting us from a racy bug. It only breaks\nsometimes.\n\nThere are a few options for fixing the quoting:\n\n  1. Backslash-escaping the dollar signs. This is perhaps the least-ugly\n     version, but it\u0027s a minor hassle to remember if somebody touches\n     the code later.\n\n  2. Single-quote the snippet, then quote interior single-quotes as\n     \u0027\\\u0027\u0027. Reasonably obvious, but ugly.\n\n  3. Use the \u0027\u003c\u003c\\EOT\u0027 here-doc trick to specify the snippet. This would\n     look nice, but we don\u0027t yet support it for prereqs. ;)\n\nThis patch uses (2), and we can circle back to (3) to make it look nicer\nlater.\n\nSigned-off-by: Jeff King \u003cpeff@peff.net\u003e\nSigned-off-by: Junio C Hamano \u003cgitster@pobox.com\u003e\n"
    },
    {
      "commit": "6de20f6092dcf9bdb1c8efe03db4b70c82b423dd",
      "tree": "5cb21f9acf8c31ce1a8f6bb0bbc3b9e4e8607ce8",
      "parents": [
        "c679abf7d2c0f3f4ee623e0882a50964e9b100cc"
      ],
      "author": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Tue Oct 06 10:13:20 2026 -0700"
      },
      "committer": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Tue Oct 06 10:13:32 2026 -0700"
      },
      "message": "The 4th batch\n\nSigned-off-by: Junio C Hamano \u003cgitster@pobox.com\u003e\n"
    },
    {
      "commit": "c679abf7d2c0f3f4ee623e0882a50964e9b100cc",
      "tree": "7df3b97c03921a61ffce23e6260e8eef9a561fda",
      "parents": [
        "38d6f3b3fd3b248a0f36bf57857533f3957d2fd8",
        "c84ed3a0abe901504ddb41e1685ebac7ba1c489c"
      ],
      "author": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Tue Oct 06 10:13:31 2026 -0700"
      },
      "committer": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Tue Oct 06 10:13:31 2026 -0700"
      },
      "message": "Merge branch \u0027as/push-force-if-includes-no-reflog\u0027\n\nThe timestamp used for checking the reflog of a remote-tracking\nbranch during \u0027git push --force-if-includes\u0027 was left uninitialized\nwhen the reflog was completely empty, which has been corrected.\n\n* as/push-force-if-includes-no-reflog:\n  push: fix --force-if-includes when remote-tracking ref has no reflog\n"
    },
    {
      "commit": "38d6f3b3fd3b248a0f36bf57857533f3957d2fd8",
      "tree": "e9e47c028191eddffe4de92adf3982bee594126b",
      "parents": [
        "1bed40ea8c6e2c36e035359bdeb1e9aa4068eb56",
        "20c35e3b71985621e160639fbf36b6c0c2c3c27a"
      ],
      "author": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Tue Oct 06 10:13:31 2026 -0700"
      },
      "committer": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Tue Oct 06 10:13:31 2026 -0700"
      },
      "message": "Merge branch \u0027js/p5551-fetch-rescan-fix\u0027\n\nThe performance test for `git fetch` pack-dir rescans has been\nupdated to use the `--no-deref` option when cleaning up\nremote-tracking branches.  This prevents `git update-ref` from\nfailing with a multiple updates error when both a symref and its\ntarget are deleted in the same transaction.\n\n* js/p5551-fetch-rescan-fix:\n  p5551: fix repeated runs with update-ref --no-deref\n"
    },
    {
      "commit": "1bed40ea8c6e2c36e035359bdeb1e9aa4068eb56",
      "tree": "2627d5a3c79e7416d09d64d3911351276a83a34b",
      "parents": [
        "0c53db4bcbbe60f35e8d93f31926393f9bc1ddce",
        "76524c2604bceee48481909e7824494498c39a34"
      ],
      "author": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Tue Oct 06 10:13:31 2026 -0700"
      },
      "committer": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Tue Oct 06 10:13:31 2026 -0700"
      },
      "message": "Merge branch \u0027jk/http-curl-strip-creds\u0027\n\nThe HTTP transport has been updated to handle changes in recent curl\nversions that strip credentials from the effective URL, preventing\nunnecessary credential prompts during redirects.\n\n* jk/http-curl-strip-creds:\n  http: handle curl stripping creds from effective url\n"
    },
    {
      "commit": "0c53db4bcbbe60f35e8d93f31926393f9bc1ddce",
      "tree": "dccf2164734703c738308084215a5d76b8deceed",
      "parents": [
        "53084239967550d5ba331c1d803093484ea0cdbb",
        "e638de60bca18b68d85f570e237c16a2adb06857"
      ],
      "author": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Tue Oct 06 10:13:31 2026 -0700"
      },
      "committer": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Tue Oct 06 10:13:31 2026 -0700"
      },
      "message": "Merge branch \u0027kz/doc-add-rm-typofix\u0027\n\nTypofixes.\n\n* kz/doc-add-rm-typofix:\n  doc: remove unnecessary commas in git-add and git-rm documentation\n"
    },
    {
      "commit": "53084239967550d5ba331c1d803093484ea0cdbb",
      "tree": "2b90d55403901912de8fcf749c8f3abc00aea6a0",
      "parents": [
        "76514ee87be3edb66beacea187f2f062fe9f5ece",
        "5efbff499c2946041ac2950ac248bac9028a16a4"
      ],
      "author": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Tue Oct 06 10:13:31 2026 -0700"
      },
      "committer": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Tue Oct 06 10:13:31 2026 -0700"
      },
      "message": "Merge branch \u0027jk/merge-ll-tempfile-cleanup\u0027\n\nThe external merge driver in \u0027git merge\u0027 now uses the tempfile API\nto create its temporary files.  This ensures that these temporaries\nare reliably cleaned up even when the merge driver or its parent Git\nprocess is terminated abruptly.\n\n* jk/merge-ll-tempfile-cleanup:\n  merge-ll: use tempfile API for external driver files\n  merge-ll: catch close() errors when writing external tempfiles\n"
    },
    {
      "commit": "76514ee87be3edb66beacea187f2f062fe9f5ece",
      "tree": "c6a494883478727273eaad77a02f3d36a523e264",
      "parents": [
        "5a7d1e8045ce66c908f62598e26cbb8df7b39a90",
        "1e5f522ef1d19117376a73a7d7730ba9593ddc51"
      ],
      "author": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Tue Oct 06 10:13:31 2026 -0700"
      },
      "committer": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Tue Oct 06 10:13:31 2026 -0700"
      },
      "message": "Merge branch \u0027js/gitlab-ci-windows-rust\u0027\n\nThe Windows GitLab CI job has been updated to provision and use the\nGCC-targeting Rust toolchain for MinGW builds, fixing job failures\ncaused by incomplete Rust setup and missing linker support.\n\n* js/gitlab-ci-windows-rust:\n  ci(gitlab,windows): provide GNU Rust\u0027s host-linker support\n  ci(gitlab,windows): fix Rust setup for GitLab\u0027s MinGW build\n  ci(gitlab,windows): preserve exclusions during dependency setup\n  ci(gitlab,windows): provision GNU Rust for SDK-based MinGW builds\n"
    },
    {
      "commit": "470c6e9fe2f5b3c260a757ef95ec3dab45710248",
      "tree": "bbe325cb3e1da38a82fe1065d7961d731825bb71",
      "parents": [
        "cc97a912eb14151fa704147e4c748038bd1ab0c4"
      ],
      "author": {
        "name": "Harald Nordgren",
        "email": "haraldnordgren@gmail.com",
        "time": "Tue Oct 06 06:56:38 2026 +0000"
      },
      "committer": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Tue Oct 06 09:20:39 2026 -0700"
      },
      "message": "ci: point test failures and fixed known breakages at their file and line\n\nA failing test gets an annotation in the Annotations list on its job\u0027s\nsummary page, naming it, for example:\n\n    failed: t1060.17 partial clone of corrupted repository\n\nwith no indication of where that test lives.\n\nFind the line a test is defined on by searching its script for the\ntest\u0027s own description as a fixed string, using the first match, and\nadd the file and line to the annotation\u0027s own message text:\n\n    failed: t1060.17 partial clone of corrupted repository (t1060-object-corruption.sh:141)\n\nFall back to naming just the script, with no line, when the\ndescription is not found verbatim, which happens when a test builds\nits description at runtime instead of writing it out literally.\n\nSigned-off-by: Harald Nordgren \u003charaldnordgren@gmail.com\u003e\nSigned-off-by: Junio C Hamano \u003cgitster@pobox.com\u003e\n"
    },
    {
      "commit": "cc97a912eb14151fa704147e4c748038bd1ab0c4",
      "tree": "41f04b1f647dc9fab7bd6c4f2d2aae5b5db58185",
      "parents": [
        "a018953688f1b10bddf91bff8747068f5f4746a4"
      ],
      "author": {
        "name": "Harald Nordgren",
        "email": "haraldnordgren@gmail.com",
        "time": "Tue Oct 06 06:56:37 2026 +0000"
      },
      "committer": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Tue Oct 06 09:20:39 2026 -0700"
      },
      "message": "ci: annotate leaks and stop a leak-sanitizer script at its first failure\n\nA leak is only discovered once, at the end of a whole script, well\nafter every test has already reported ok, and it gets no annotation at\nall, so a leak-sanitizer job\u0027s only visible failure is:\n\n    Process completed with exit code 1.\n\nGive a leak its own annotation, naming the script it turned up in, the\nexact line isn\u0027t known, only which script:\n\n    memory leak logged in t1060 (t1060-object-corruption.sh)\n\nPut the sanitizer report in a log group next to it, so it stays\nvisible.\n\nOnce a script has one leak, it keeps running: the sanitizer log\ndirectory is never cleared between tests, so every later test in the\nsame script sees the same leftover log entries and also reports \"not\nok\", burying the one real failure in copies of itself. Stop a\nleak-sanitizer script at its first failure with --immediate instead.\n\nA failing test already gets its own annotation once its script\nfinishes, but --immediate exits as soon as that test fails, before\nreaching the code that writes it. Write the annotation first, so\nturning on --immediate here does not silently drop it.\n\nSigned-off-by: Harald Nordgren \u003charaldnordgren@gmail.com\u003e\nSigned-off-by: Junio C Hamano \u003cgitster@pobox.com\u003e\n"
    },
    {
      "commit": "86129fddb7e68efa8a6da682e6eced3ade4d943b",
      "tree": "5af002f092e7d9b768a5d2bbb4a21b15f724fb25",
      "parents": [
        "c46c1e37724f0478939de636ab8ea5a89086d532"
      ],
      "author": {
        "name": "Colin Hinton",
        "email": "colinlewishinton@gmail.com",
        "time": "Mon Oct 05 20:22:58 2026 -0700"
      },
      "committer": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Tue Oct 06 09:20:07 2026 -0700"
      },
      "message": "fetch.c: defer fetch.followRemoteHEAD validation\n\nThe value of the fetch.followRemoteHEAD configuration variable is\nvalidated while the configuration file is being parsed, which\nproduces a warning even when this particular \"git fetch\" invocation\nwill never consult it.\n\nStore the raw config string instead, and resolve/validate it lazily\nat the one place in do_fetch() that actually uses it, so a mistyped\nvalue only warns, and a missing value only dies, when this fetch\nwould have consulted it.\n\nremote.c\u0027s handle_config() has the same problem for\nremote.\u003cname\u003e.followRemoteHEAD, but is left unaddressed here since\nit touches shared remote-parsing infrastructure used well beyond\nfetch. Leave a NEEDSWORK comment at remote.c:handle_config()\nthat has a defect similar to what is fixed by this patch,\nso the remaining scope is easy to find for a follow-up patch.\n\nSigned-off-by: Colin Hinton \u003ccolinlewishinton@gmail.com\u003e\nSigned-off-by: Junio C Hamano \u003cgitster@pobox.com\u003e\n"
    },
    {
      "commit": "8d596ea8e77711ab0109e301f71da0929bca6582",
      "tree": "b0b08ac591ff4b3510428832dedaf4c987e553e2",
      "parents": [
        "4c32d2259b1342abcdd1a6927e0869da374d02a9"
      ],
      "author": {
        "name": "Patrick Steinhardt",
        "email": "ps@pks.im",
        "time": "Tue Oct 06 12:20:15 2026 +0200"
      },
      "committer": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Tue Oct 06 09:04:24 2026 -0700"
      },
      "message": "packfile: fix corruption due to stale delta base cache entries\n\nThe delta base cache is a process-global hashmap that is keyed by the\naddress of the `struct packed_git` plus the offset of the base object\nwithin that pack. Entries part of the cache are never removed when a\npack is closed, and neither when the pack is subsequently freed. As a\nconsequence, the cache may contain stale entries.\n\nFor a long time, the worst consequence of this leaking cache was that we\nheld on to memory that we could\u0027ve released. But the reason for this was\nthat we didn\u0027t even free the packfiles, either. That has changed in\n6f1e9394e2 (object: fix leaking packfiles when closing object store,\n2024-08-08), where we plugged that leak.\n\nNow that we free them, a new packfile may be allocated using the exact\nsame address as a previously allocated one. And if the new packfile has\nboth the same address and a similar layout, it may happen that a\npreexisting entry from a previously-allocated in the delta base cache\nwould have the exact same key.\n\nAll of this sounds very theoretical, but we can actually trigger this\nbug somewhat reliably! When doing a merge in a repository with lots of\nsubmodules that have similar-looking packfiles we end up opening and\nthen closing the object databases of each of the submodules in sequence.\nBecause of the above mentioned commit we would close and free each of\nthe packfiles part of the respective databases, but we wouldn\u0027t evict\ntheir delta base entries from the cache.\n\nWhen using glibc, one of the packfiles will eventually get the exact\nsame address, and that will then cause Git to read the wrong entry from\nthe cache. Git detects this and aborts with an error:\n\n    $ git merge branch-b\n    error: Could not read 584ef938be4a749bfa13f68d5ac5545bc029e529\n    error: could not parse commit 584ef938be4a749bfa13f68d5ac5545bc029e529\n    error: failed to merge submodule G (repository corrupt)\n\nNow in this case we\u0027re lucky that Git detects this error because we try\nto read a commit from a different submodule via an object database that\ndoesn\u0027t have it. But potentially, in an even more contrived scenario, we\nmight even silently yield wrong data from the cache.\n\nFix this bug by evicting cache entries that belong to a specific pack\nwhen closing it.\n\nNote that the added test reliably reproduces the above bug on my machine\nthat uses NixOS at c59305bab206 (cosmic-applets: add missing runtime\ndependency (#566040), 2026-10-01) with glibc 2.44-25. But as we rely on\nspecific allocation behaviour of glibc it is very likely that the test\nwill not work on other platforms.\n\nReported-by: Guillaume Chauvel \u003cguillaume.chauvel@gmail.com\u003e\nHelped-by: Philippe Blain \u003clevraiphilippeblain@gmail.com\u003e\nSigned-off-by: Patrick Steinhardt \u003cps@pks.im\u003e\nSigned-off-by: Junio C Hamano \u003cgitster@pobox.com\u003e\n"
    },
    {
      "commit": "4c32d2259b1342abcdd1a6927e0869da374d02a9",
      "tree": "94bcebc5c860f07a91411e2de6d6732122180c41",
      "parents": [
        "a018953688f1b10bddf91bff8747068f5f4746a4"
      ],
      "author": {
        "name": "Patrick Steinhardt",
        "email": "ps@pks.im",
        "time": "Tue Oct 06 12:20:14 2026 +0200"
      },
      "committer": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Tue Oct 06 09:04:24 2026 -0700"
      },
      "message": "packfile: move around `close_pack()`\n\nIn the next commit we\u0027ll want to access the delta base cache in\n`close_pack()`. Move the function after the declaration of the cache so\nthat we won\u0027t need a forward declaration.\n\nSigned-off-by: Patrick Steinhardt \u003cps@pks.im\u003e\nSigned-off-by: Junio C Hamano \u003cgitster@pobox.com\u003e\n"
    },
    {
      "commit": "5a7d1e8045ce66c908f62598e26cbb8df7b39a90",
      "tree": "0b53ce40aa2f3cc95fcf9288bd6a01a27db3538c",
      "parents": [
        "8fff6394339345edde1db563860f9f31b78ab479"
      ],
      "author": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Mon Oct 05 13:52:15 2026 -0700"
      },
      "committer": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Mon Oct 05 13:52:30 2026 -0700"
      },
      "message": "The 3rd batch\n\nSigned-off-by: Junio C Hamano \u003cgitster@pobox.com\u003e\n"
    },
    {
      "commit": "8fff6394339345edde1db563860f9f31b78ab479",
      "tree": "06e3fd5f93861af0ac8fc9d44d65580688dcf290",
      "parents": [
        "9ac1e81458462e59c8cbcb319a0c20174dcee9da",
        "b2ab8fccc35471c6917e69433613b84135c94397"
      ],
      "author": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Mon Oct 05 13:52:29 2026 -0700"
      },
      "committer": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Mon Oct 05 13:52:30 2026 -0700"
      },
      "message": "Merge branch \u0027jk/name-rev-update-hash-descriptions\u0027\n\nThe documentation for \u0027git-name-rev\u0027 has been updated to refer to\nobject IDs instead of SHA-1, to more accurately reflect that the\nactive hash algorithm is used.\n\n* jk/name-rev-update-hash-descriptions:\n  name-rev: update hash descriptions\n"
    },
    {
      "commit": "9ac1e81458462e59c8cbcb319a0c20174dcee9da",
      "tree": "4b260b53da12868f8cecacbef9d23092efe505b5",
      "parents": [
        "053d5d236540d440f3d601bdecdcf84d366ba008",
        "da2926c8f5fa806540979c28e2564ac55533fce2"
      ],
      "author": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Mon Oct 05 13:52:29 2026 -0700"
      },
      "committer": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Mon Oct 05 13:52:29 2026 -0700"
      },
      "message": "Merge branch \u0027jk/parse-revision-opt-fixes\u0027\n\nThe command-line parsing of revision options has been updated to\nproperly distinguish between malformed and unknown options, and to\ncorrectly report the name of unknown options after they have been\nmoved during the option parsing process.\n\n* jk/parse-revision-opt-fixes:\n  revision: handle argv movement in parse_revision_opt()\n  revision: avoid reporting known options as unknown on error\n"
    },
    {
      "commit": "053d5d236540d440f3d601bdecdcf84d366ba008",
      "tree": "edaad6407de0f3a558585e7ce60ebe83537aa890",
      "parents": [
        "075eedb1508f86dede63169d4fd6a1aae33ec266",
        "ebc067f3cc71fc21adb77c5a91ca46f2fc569217"
      ],
      "author": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Mon Oct 05 13:52:29 2026 -0700"
      },
      "committer": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Mon Oct 05 13:52:29 2026 -0700"
      },
      "message": "Merge branch \u0027rs/dir-skip-nested-repo-fix\u0027\n\nThe directory traversal logic has been updated to correctly evaluate\npathspecs for ignored directories containing nested repositories,\nand has been fortified to gracefully handle null pathspecs during\ncheckout operations.\n\n* rs/dir-skip-nested-repo-fix:\n  dir: skip excluded directory with nested repo on prefix match\n"
    },
    {
      "commit": "075eedb1508f86dede63169d4fd6a1aae33ec266",
      "tree": "3204883332075bc99c669d77808fef45bb27aceb",
      "parents": [
        "0f1778a8d565daaa4b76a6af57c551621658c8c0",
        "2fc11e33820f1032ad6f253f386717746a8dce97"
      ],
      "author": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Mon Oct 05 13:52:29 2026 -0700"
      },
      "committer": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Mon Oct 05 13:52:29 2026 -0700"
      },
      "message": "Merge branch \u0027je/doc-asciidoc-xrefs\u0027\n\nVarious documentation files have been updated to use explicit\n\u0027\u003c\u003cTARGET,TARGET\u003e\u003e\u0027 AsciiDoc cross-references instead of plain text\nreferences.  This improves rendering on the web and avoids broken\nlinks when manual pages are included into other pages.\n\n* je/doc-asciidoc-xrefs:\n  doc: add more AsciiDoc cross-references\n"
    },
    {
      "commit": "0f1778a8d565daaa4b76a6af57c551621658c8c0",
      "tree": "a630cb8888baab1389cd92e6c79915a59d50ccee",
      "parents": [
        "8983b6ac7a814e6847bda813520e19e169bdab28",
        "f6f2cf39ea21d116302e076a4dab9250553736b2"
      ],
      "author": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Mon Oct 05 13:52:29 2026 -0700"
      },
      "committer": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Mon Oct 05 13:52:29 2026 -0700"
      },
      "message": "Merge branch \u0027yn/worktree-repair-completion\u0027\n\nThe command-line completion script (in \u0027contrib/\u0027) has been taught\nto complete the \u0027repair\u0027 subcommand for \u0027git worktree\u0027.\n\n* yn/worktree-repair-completion:\n  completion: complete \u0027git worktree repair\u0027\n"
    },
    {
      "commit": "8983b6ac7a814e6847bda813520e19e169bdab28",
      "tree": "893e6629e8774e2711f36fc9bdf7e321e62c4702",
      "parents": [
        "0d1374ead39043156a873e0072b323c5c7ed4356",
        "933247f61c536b0c5e87d45d2a45f3c56e4752c0"
      ],
      "author": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Mon Oct 05 13:52:29 2026 -0700"
      },
      "committer": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Mon Oct 05 13:52:29 2026 -0700"
      },
      "message": "Merge branch \u0027kn/ci-unit-tests-on-windows-fix\u0027\n\nThe CI script has been updated to check for one-indexed slice numbers\nwhen deciding to run unit tests on Windows, mirroring the behaviour in\nthe modern GitHub and GitLab workflows.\n\n* kn/ci-unit-tests-on-windows-fix:\n  ci: fix unit tests not running on windows\n"
    },
    {
      "commit": "0d1374ead39043156a873e0072b323c5c7ed4356",
      "tree": "c20c55ef60706f4210811a2d14af2a01dcb47445",
      "parents": [
        "3906479d1372931460e2bb5af8064322d255b75e",
        "60cf5005515d6df30bfc3c1dd13475e13b12f445"
      ],
      "author": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Mon Oct 05 13:52:28 2026 -0700"
      },
      "committer": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Mon Oct 05 13:52:28 2026 -0700"
      },
      "message": "Merge branch \u0027ps/reflog-expiry-fix\u0027\n\nThe default expiry periods for both reachable and unreachable reflog\nentries have been corrected from a past regression that swapped\nthem.\n\n* ps/reflog-expiry-fix:\n  reflog: fix default expiry periods\n"
    },
    {
      "commit": "3906479d1372931460e2bb5af8064322d255b75e",
      "tree": "94f8775e307eb98a9e99462eb93bbc42edd5ba82",
      "parents": [
        "d2bda356b714a9fe4edec3541dda98f061efa9fb",
        "64172cf117bd00f0caee5e6e0ab7de30aab587f4"
      ],
      "author": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Mon Oct 05 13:52:28 2026 -0700"
      },
      "committer": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Mon Oct 05 13:52:28 2026 -0700"
      },
      "message": "Merge branch \u0027js/ci-debian-12-http2-workaround\u0027\n\nThe Debian 12 CI job has been updated to skip a half-auth clone test\nthat occasionally fails due to a bug in the packaged curl version\nhandling early HTTP/2 responses.\n\n* js/ci-debian-12-http2-workaround:\n  ci: work around Debian 12\u0027s HTTP/2 authentication failures\n"
    },
    {
      "commit": "d2bda356b714a9fe4edec3541dda98f061efa9fb",
      "tree": "63c20fcddc2da1a833f6a22ae8740faac4754105",
      "parents": [
        "cfbffcd204a36fae4426f258bfb2e480bad1f945",
        "ef7faa6350fc2ee4151584bd912dfd61606be98c"
      ],
      "author": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Mon Oct 05 13:52:28 2026 -0700"
      },
      "committer": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Mon Oct 05 13:52:28 2026 -0700"
      },
      "message": "Merge branch \u0027jt/object-file-batch-fsync-fix\u0027\n\nWhen \u0027core.fsyncMethod\u0027 is set to \u0027batch\u0027, the ODB transaction\nfailed to properly flush large blob packfiles residing in the\ntemporary directory before migrating the directory\u0027s contents to the\nmain object store.  The execution sequence has been corrected by\nperforming the packfile flush before the temporary directory\nmigration, averting failure.\n\n* jt/object-file-batch-fsync-fix:\n  object-file: flush transaction packfile before migrating objects\n  object-file: lift ODB reprepare out of packfile flush\n"
    },
    {
      "commit": "cfbffcd204a36fae4426f258bfb2e480bad1f945",
      "tree": "76b53df8052776efa956f3e9c23d7349d0fdbb85",
      "parents": [
        "de66ba8633af699fe293fa081487985c853a677e",
        "eba1a1c5dd79cf798e9b891d508276d4283ceaa1"
      ],
      "author": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Mon Oct 05 13:52:28 2026 -0700"
      },
      "committer": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Mon Oct 05 13:52:28 2026 -0700"
      },
      "message": "Merge branch \u0027tb/rerere-lock-grace\u0027\n\nThe sequencer machinery (used by \u0027git rebase\u0027, \u0027git cherry-pick\u0027, and\n\u0027git revert\u0027) has been updated to defer automatic maintenance tasks\nuntil the end of the operation, preventing nested \u0027git commit\u0027, \u0027git\nmerge\u0027, and \u0027exec\u0027 commands from triggering GC operations that could\ncontend for locks or delete open packs while the sequence is in\nprogress.\n\n* tb/rerere-lock-grace:\n  sequencer: disable auto maintenance in spawned commands\n  rebase, cherry-pick, revert: run auto maintenance when done\n  config: add git_config_append_parameter()\n"
    },
    {
      "commit": "de66ba8633af699fe293fa081487985c853a677e",
      "tree": "ad32ba7d2656bf9c57002dab4a02e13c991539a4",
      "parents": [
        "8103b446517e0c44e67561b9d0ccce56efa60a71",
        "79ac6eff39af19b8a1f63a5ff9320dc9d7579fcf"
      ],
      "author": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Mon Oct 05 13:52:28 2026 -0700"
      },
      "committer": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Mon Oct 05 13:52:28 2026 -0700"
      },
      "message": "Merge branch \u0027yt/winansi-die-lasterr-fix\u0027\n\nThe error reporting machinery in the WinANSI compatibility layer has\nbeen simplified to pass the exact Windows error code and correctly\nformat arguments for fatal errors.\n\n* yt/winansi-die-lasterr-fix:\n  compat/winansi: fix die_lasterr() argument formatting\n"
    },
    {
      "commit": "5008bde9900db114f106e3262108ce726b879a11",
      "tree": "7b69b8701328aab3e465ba016dab98d1cac56096",
      "parents": [
        "4ddd9f289debef7878f737b05de9a56989152b33"
      ],
      "author": {
        "name": "Kristoffer Haugsbakk",
        "email": "code@khaugsbakk.name",
        "time": "Sun Oct 04 19:58:35 2026 +0200"
      },
      "committer": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Sun Oct 04 14:24:27 2026 -0700"
      },
      "message": "format-patch: learn --[no-]range-diff-notes\n\ngit-format-patch(1) passes on the notes behavior that it is using for\nthe patches to git-range-diff(1). In turn you get the same Git notes\ndisplayed in the range diff as the ones you used to generate the\npatches. And that makes sense in most cases.\n\nHowever, I often make notes between series versions that mostly prepend\nto the original. They end up looking like this:\n\n    v3:\n    [desc.]\n    v2:\n    [descr.]\n    v1:\n    [descr.]\n\nThese notes are meant for the git-format-patch(1) output since they\ndocument the iterations. But including them also includes them in the\nrange diff. And they have nothing useful to say there.\n\nLet’s teach git-format-patch(1) `--[no-]range-diff-notes` so that we\ncan pass in different notes refs to the range diff, or just turn them\noff entirely.\n\nIn addition to storing the list of notes, we also need a boolean\n`override` to distinguish these two cases:\n\n1. No such options were given and empty list (use `--notes`)\n2. Options were given and empty list (`--no-...` given; don’t use notes)\n\nUnlike `--creation-factor`, `--[no-]range-diff-notes` does not error out\nwhen used without `--range-diff`. This flexibility accommodates\nworkflows where users might configure default options in aliases or\nwrapper scripts, allowing `--range-diff` to be toggled independently.\n\nAdd two tests here for the single-patch case, i.e. the case where the\nrange diff is on the patch and not in the cover letter. These are meant\nas regression tests based on my encounter with single-patch range diff\nnotes handling bug.[1]\n\n† 1: 155986b4 (format-patch: handle range-diff on notes correctly for\n     single patches, 2025-09-25)\n\nHelped-by: Junio C Hamano \u003cgitster@pobox.com\u003e\nSigned-off-by: Kristoffer Haugsbakk \u003ccode@khaugsbakk.name\u003e\nSigned-off-by: Junio C Hamano \u003cgitster@pobox.com\u003e\n"
    },
    {
      "commit": "4ddd9f289debef7878f737b05de9a56989152b33",
      "tree": "d728ab0c2d125dccf2773341e5321e5a588dff87",
      "parents": [
        "593c42fe075be0c8cd5239b3a2f21c610cbc9798"
      ],
      "author": {
        "name": "Kristoffer Haugsbakk",
        "email": "code@khaugsbakk.name",
        "time": "Sun Oct 04 19:58:34 2026 +0200"
      },
      "committer": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Sun Oct 04 14:24:27 2026 -0700"
      },
      "message": "format-patch: simplify get_notes_arg parameters\n\n85bd88a7 (revision: add rdiff_log_arg to rev_info, 2025-09-25) added\n`rdiff_log_arg` to `struct rev_info`. `get_notes_arg` was changed to\ntake a second parameter, namely that member:\n\n    get_notes_args(\u0026(rev.rdiff_log_arg), \u0026rev);\n\nBut this is obviously unnecessary; we can just use `\u0026rev`.\n\nNow is also a good time to format this `for_each...` line since it’s\ngotten quite long.\n\nSigned-off-by: Kristoffer Haugsbakk \u003ccode@khaugsbakk.name\u003e\nSigned-off-by: Junio C Hamano \u003cgitster@pobox.com\u003e\n"
    },
    {
      "commit": "28699cf58187fbfb367fcb02d337e93cac9e79e4",
      "tree": "0d841fd39c0a6f0ff88b178942875024e3f2a92c",
      "parents": [
        "e9019fcafe0040228b8631c30f97ae1adb61bcdc"
      ],
      "author": {
        "name": "Phillip Wood",
        "email": "phillip.wood@dunelm.org.uk",
        "time": "Sun Oct 04 11:05:52 2026 +0100"
      },
      "committer": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Sun Oct 04 14:17:12 2026 -0700"
      },
      "message": "stash: use named constant when parsing \"--all\"\n\nThe code that stashes all untracked files compares the value of the\n\"include_untracked\" variable to the constant \"INCLUDE_ALL_FILES\",\nhowever the option parsing code for \"--all\" uses a hard coded integer\ninstead. Replace the integer with the named constant.\n\nSigned-off-by: Phillip Wood \u003cphillip.wood@dunelm.org.uk\u003e\nSigned-off-by: Junio C Hamano \u003cgitster@pobox.com\u003e\n"
    },
    {
      "commit": "42017ff9792f75fec560b984edcc969eecbad15c",
      "tree": "814df6fb869ecaec930a3a7a61bef4b1c336024c",
      "parents": [
        "a018953688f1b10bddf91bff8747068f5f4746a4"
      ],
      "author": {
        "name": "Kristoffer Haugsbakk",
        "email": "code@khaugsbakk.name",
        "time": "Sat Oct 03 18:03:19 2026 +0200"
      },
      "committer": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Sun Oct 04 09:03:30 2026 -0700"
      },
      "message": "doc: interpret-trailers: fix cmd examples\n\nFix `trailer.\u003ckey-alias\u003e.cmd` examples which have remained unchanged\nsince they were written in c364b7ef (trailer: add new .cmd config\noption, 2021-05-03). (Modulo formatting changes.)\n\nSteal how the `see` example is phrased and use that as a template:\n\n    Configure a `see` trailer with a command to show the subject of a\n    commit that is related, and show how it works:\n\nSigned-off-by: Kristoffer Haugsbakk \u003ccode@khaugsbakk.name\u003e\nSigned-off-by: Junio C Hamano \u003cgitster@pobox.com\u003e\n"
    },
    {
      "commit": "8103b446517e0c44e67561b9d0ccce56efa60a71",
      "tree": "87d5c56ba6b957f2efaba9baddab51f53487ce70",
      "parents": [
        "f85fa0c567c1e06e4ff171dae086e911cf3c4b6e"
      ],
      "author": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Sat Oct 03 21:43:17 2026 -0700"
      },
      "committer": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Sat Oct 03 21:45:55 2026 -0700"
      },
      "message": "The 2nd batch\n\nSigned-off-by: Junio C Hamano \u003cgitster@pobox.com\u003e\n"
    },
    {
      "commit": "f85fa0c567c1e06e4ff171dae086e911cf3c4b6e",
      "tree": "f02d5e567cf3aea089bb5aa2ad58f0b02989f58e",
      "parents": [
        "6c698d827de9ea31fd8fc3571a86b881d46885f0",
        "38bdda17dd33e42193f1b3b7e91797d5c03145d4"
      ],
      "author": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Sat Oct 03 21:45:55 2026 -0700"
      },
      "committer": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Sat Oct 03 21:45:55 2026 -0700"
      },
      "message": "Merge branch \u0027jk/pull-null-merge-head\u0027\n\n\u0027git pull\u0027 has been taught to fail more gracefully instead of\nsegfaulting when lookup_commit_reference() fails on unparseable\nobjects.\n\n* jk/pull-null-merge-head:\n  pull: avoid segfault when commit lookup fails\n"
    },
    {
      "commit": "6c698d827de9ea31fd8fc3571a86b881d46885f0",
      "tree": "dd667d9be8137411089cb6950c07ef7d62e5af8b",
      "parents": [
        "8bc9c7fcfd89cc1dda2d08f41ad5801f42b29d8f",
        "9a13b3742b935aca4c686bfdf2f4e76dbab77e13"
      ],
      "author": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Sat Oct 03 21:45:55 2026 -0700"
      },
      "committer": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Sat Oct 03 21:45:55 2026 -0700"
      },
      "message": "Merge branch \u0027hd/diff-no-index-reverse-fix\u0027\n\nA bug in git diff --no-index that mishandled reverse (-R) output\nwhen conflicts existed between a file and a directory has been\nfixed.\n\n* hd/diff-no-index-reverse-fix:\n  diff --no-index: fix -R with file/directory conflicts\n"
    },
    {
      "commit": "8bc9c7fcfd89cc1dda2d08f41ad5801f42b29d8f",
      "tree": "7b813a54128b5bdd284612f15058dfa6293b2e69",
      "parents": [
        "2fd3d524ea536b9845907d69983ffa6d6072b173",
        "c88341b7e1a5ca3c384c2a3aeb62b72fffbd8c00"
      ],
      "author": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Sat Oct 03 21:45:55 2026 -0700"
      },
      "committer": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Sat Oct 03 21:45:55 2026 -0700"
      },
      "message": "Merge branch \u0027js/coverity-fixes\u0027\n\nAssorted fixes for code paths that are not careful with boundary and\nerror conditions.\n\n* js/coverity-fixes:\n  test-read-midx: check midx_fill_entry() result\n  oss-fuzz: handle reftable iterator initialization failures\n  t/unit-tests: check reftable iterator initialization\n  rerere: do not record failed conflict resolution data\n  midx: validate incremental MIDX pack IDs\n  gpg-interface: make signature-prefix matching length-aware\n  wrapper: guard writev_in_full() against signed overflow\n"
    },
    {
      "commit": "2fd3d524ea536b9845907d69983ffa6d6072b173",
      "tree": "fbf423a21364bb578135047a0ae85b1fe4b46a01",
      "parents": [
        "61bd247fa14330b1fa74a1aa612cc01132e571d3",
        "191740edaa4a17813b8e1595e3ef15068f88c8ba"
      ],
      "author": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Sat Oct 03 21:45:54 2026 -0700"
      },
      "committer": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Sat Oct 03 21:45:55 2026 -0700"
      },
      "message": "Merge branch \u0027rr/upload-pack-swap-shallow-wanted-ref\u0027\n\nThe server-side protocol v2 response order for \u0027wanted-refs\u0027 and\n\u0027shallow-info\u0027 has been swapped to match the client\u0027s expectation,\nfixing a fetch failure when the server has \u0027uploadpack.allowRefInWant\u0027\nenabled and the client performs a shallow fetch.\n\n* rr/upload-pack-swap-shallow-wanted-ref:\n  upload-pack: swap wanted-ref/shallow-info responses\n"
    },
    {
      "commit": "61bd247fa14330b1fa74a1aa612cc01132e571d3",
      "tree": "3f87095ab8803f78f1ced58458eec0bfdad3fbb8",
      "parents": [
        "30cc6c91b618a26a355558d6ee6aadbe7a0d5d85",
        "700f7b74de75ba9bc6c463e2ded8c0144390f9b8"
      ],
      "author": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Sat Oct 03 21:45:54 2026 -0700"
      },
      "committer": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Sat Oct 03 21:45:54 2026 -0700"
      },
      "message": "Merge branch \u0027of/commit-reach-repo-awareness\u0027\n\nThe can_all_from_reach() and can_all_from_reach_with_flag()\nfunctions have been updated to accept a repository context,\npreventing bugs where submodule merging incorrectly reads from the\nsuperproject\u0027s commit-graph.\n\n* of/commit-reach-repo-awareness:\n  commit-reach: parse commits in the given repository\n"
    },
    {
      "commit": "30cc6c91b618a26a355558d6ee6aadbe7a0d5d85",
      "tree": "c232e8670e16ecfd888792fadd26de83b64c34ea",
      "parents": [
        "c46c1e37724f0478939de636ab8ea5a89086d532",
        "8d3a6731471521eb1ee7e3dd73d15b123f7ba0b2"
      ],
      "author": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Sat Oct 03 21:45:54 2026 -0700"
      },
      "committer": {
        "name": "Junio C Hamano",
        "email": "gitster@pobox.com",
        "time": "Sat Oct 03 21:45:54 2026 -0700"
      },
      "message": "Merge branch \u0027sg/precompile-git-compat-util\u0027\n\nThe \u0027Makefile\u0027 has been taught to precompile \u0027git-compat-util.h\u0027 to\nspeed up overall compilation, while excluding sources that do not\ninclude the compatibility header.\n\n* sg/precompile-git-compat-util:\n  Makefile: precompile \"git-compat-util.h\"\n  Makefile: reintroduce REFTABLE_OBJS\n  cmake: remove any \"$(*_OBJS)\" variables when parsing Makefile for sources\n  Makefile: remove XDIFF_OBJS initialization\n"
    }
  ],
  "next": "1c0cec6657bf901090544479246ca9d7428ffad4"
}
