Git v2.98 Release Notes
=======================

This is meant to be the antepenultimate release to prepare for the
long anticipated Git 3.0 which has been vaporware for so long.


UI, Workflows & Features
------------------------

 * The experimental 'git history' command has been taught a new 'squash'
   subcommand to fold a range of commits into a single commit, with any
   descendants replayed on top.

 * A new hook 'report' is added to 'git receive-pack', which runs after
   reference updates and allows the server to filter or modify the
   packet-line status report sent back to the client.

 * The terminology regarding reference storage formats has been unified
   across command-line options, environment variables, configuration
   variables, and source code, standardizing on the phrase "ref storage
   format" (e.g., `--ref-storage-format`, `'GIT_REF_STORAGE_FORMAT'`).
   Additionally, the `--ref-storage-format` option has been updated to
   accept payloads in the form `<format>://<payload>`.

 * The build-time knob 'USE_NSEC' for nanosecond stat precision has been
   converted to a runtime configuration 'core.useNanosec', allowing
   distributions to bundle one binary that adapts to filesystem
   capabilities dynamically.

 * The command-line completion script (in 'contrib/') has been taught
   to complete the 'repair' subcommand for 'git worktree'.

 * Various documentation files have been updated to use explicit
   '<<TARGET,TARGET>>' AsciiDoc cross-references instead of plain text
   references.  This improves rendering on the web and avoids broken
   links when manual pages are included into other pages.


Performance, Internal Implementation, Development Support etc.
--------------------------------------------------------------

 * The setup of alternates has been deferred to object database
   creation time during clone, which drops the unused ad-hoc alternate
   writing API, simplifying the object database backend interface.

 * Updates to Coccinelle semantic patches to correctly handle the
   'FREE_AND_NULL()' macro and avoid generating broken transformations
   for negated pointer checks.

 * The 'Makefile' has been taught to precompile 'git-compat-util.h' to
   speed up overall compilation, while excluding sources that do not
   include the compatibility header.

 * The can_all_from_reach() and can_all_from_reach_with_flag()
   functions have been updated to accept a repository context,
   preventing bugs where submodule merging incorrectly reads from the
   superproject's commit-graph.

 * The error reporting machinery in the WinANSI compatibility layer has
   been simplified to pass the exact Windows error code and correctly
   format arguments for fatal errors.

 * The Debian 12 CI job has been updated to skip a half-auth clone test
   that occasionally fails due to a bug in the packaged curl version
   handling early HTTP/2 responses.

 * The CI script has been updated to check for one-indexed slice numbers
   when deciding to run unit tests on Windows, mirroring the behaviour in
   the modern GitHub and GitLab workflows.

 * The Windows GitLab CI job has been updated to provision and use the
   GCC-targeting Rust toolchain for MinGW builds, fixing job failures
   caused by incomplete Rust setup and missing linker support.
   (merge 1e5f522ef1 js/gitlab-ci-windows-rust later to maint).

 * The external merge driver in 'git merge' now uses the tempfile API
   to create its temporary files.  This ensures that these temporaries
   are reliably cleaned up even when the merge driver or its parent Git
   process is terminated abruptly.

 * The performance test for `git fetch` pack-dir rescans has been
   updated to use the `--no-deref` option when cleaning up
   remote-tracking branches.  This prevents `git update-ref` from
   failing with a multiple updates error when both a symref and its
   target are deleted in the same transaction.



Fixes since v2.56
-----------------

 * Updates to Coccinelle semantic patches to correctly handle the
   'FREE_AND_NULL()' macro and avoid generating broken transformations
   for negated pointer checks.
   (merge 32814b69d0 jc/cocci-free-updates later to maint).

 * The files backend has been updated to avoid unconditionally locking
   the 'packed-refs' file when deleting a root ref (which are never
   packed).
   (merge d8e4585822 ak/refs-files-root-ref-lock later to maint).

 * The server-side protocol v2 response order for 'wanted-refs' and
   'shallow-info' has been swapped to match the client's expectation,
   fixing a fetch failure when the server has 'uploadpack.allowRefInWant'
   enabled and the client performs a shallow fetch.
   (merge 191740edaa rr/upload-pack-swap-shallow-wanted-ref later to maint).

 * Assorted fixes for code paths that are not careful with boundary and
   error conditions.
   (merge c88341b7e1 js/coverity-fixes later to maint).

 * A bug in git diff --no-index that mishandled reverse (-R) output
   when conflicts existed between a file and a directory has been
   fixed.
   (merge 9a13b3742b hd/diff-no-index-reverse-fix later to maint).

 * 'git pull' has been taught to fail more gracefully instead of
   segfaulting when lookup_commit_reference() fails on unparseable
   objects.
   (merge 38bdda17dd jk/pull-null-merge-head later to maint).

 * The sequencer machinery (used by 'git rebase', 'git cherry-pick', and
   'git revert') has been updated to defer automatic maintenance tasks
   until the end of the operation, preventing nested 'git commit', 'git
   merge', and 'exec' commands from triggering GC operations that could
   contend for locks or delete open packs while the sequence is in
   progress.
   (merge eba1a1c5dd tb/rerere-lock-grace later to maint).

 * When 'core.fsyncMethod' is set to 'batch', the ODB transaction
   failed to properly flush large blob packfiles residing in the
   temporary directory before migrating the directory's contents to the
   main object store.  The execution sequence has been corrected by
   performing the packfile flush before the temporary directory
   migration, averting failure.
   (merge ef7faa6350 jt/object-file-batch-fsync-fix later to maint).

 * The default expiry periods for both reachable and unreachable reflog
   entries have been corrected from a past regression that swapped
   them.
   (merge 60cf500551 ps/reflog-expiry-fix later to maint).

 * The directory traversal logic has been updated to correctly evaluate
   pathspecs for ignored directories containing nested repositories,
   and has been fortified to gracefully handle null pathspecs during
   checkout operations.
   (merge ebc067f3cc rs/dir-skip-nested-repo-fix later to maint).

 * The command-line parsing of revision options has been updated to
   properly distinguish between malformed and unknown options, and to
   correctly report the name of unknown options after they have been
   moved during the option parsing process.
   (merge da2926c8f5 jk/parse-revision-opt-fixes later to maint).

 * The documentation for 'git-name-rev' has been updated to refer to
   object IDs instead of SHA-1, to more accurately reflect that the
   active hash algorithm is used.
   (merge b2ab8fccc3 jk/name-rev-update-hash-descriptions later to maint).

 * The HTTP transport has been updated to handle changes in recent curl
   versions that strip credentials from the effective URL, preventing
   unnecessary credential prompts during redirects.
   (merge 76524c2604 jk/http-curl-strip-creds later to maint).

 * The timestamp used for checking the reflog of a remote-tracking
   branch during 'git push --force-if-includes' was left uninitialized
   when the reflog was completely empty, which has been corrected.
   (merge c84ed3a0ab as/push-force-if-includes-no-reflog later to maint).

 * Other code cleanup, docfix, build fix, etc.
   (merge e638de60bc kz/doc-add-rm-typofix later to maint).
