Git v2.48 Release Notes
=======================

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

 * A new configuration variable remote.<name>.serverOption makes the
   transport layer act as if the --serverOption=<value> option is
   given from the command line.

 * "git rebase --rebase-merges" now uses branch names as labels when
   able.

 * Describe the policy to introduce breaking changes.

 * Teach 'git notes add' and 'git notes append' a new '-e' flag,
   instructing them to open the note in $GIT_EDITOR before saving.

 * Documentation for "git bundle" saw improvements to more prominently
   call out the use of '--all' when creating bundles.

 * Drop support for older libcURL and Perl.

 * End-user experience of "git mergetool" when the command errors out
   has been improved.

 * "git bundle --unbundle" and "git clone" running on a bundle file
   both learned to trigger fsck over the new objects with configurable
   fck check levels.

 * When "git fetch $remote" notices that refs/remotes/$remote/HEAD is
   missing and discovers what branch the other side points with its
   HEAD, refs/remotes/$remote/HEAD is updated to point to it.

 * "git fetch" honors "remote.<remote>.followRemoteHEAD" settings to
   tweak the remote-tracking HEAD in "refs/remotes/<remote>/HEAD".

 * "git range-diff" learned to optionally show and compare merge
   commits in the ranges being compared, with the --diff-merges
   option.


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

 * Document "amlog" notes.

 * The way AsciiDoc is used for SYNOPSIS part of the manual pages has
   been revamped.  The sources, at least for the simple cases, got
   vastly pleasant to work with.

 * The reftable library is now prepared to expect that the memory
   allocation function given to it may fail to allocate and to deal
   with such an error.

 * An extra worktree attached to a repository points at each other to
   allow finding the repository from the worktree and vice versa
   possible.  Turn this linkage to relative paths.

 * Enable Windows-based CI in GitLab.

 * Commands that can also work outside Git have learned to take the
   repository instance "repo" when we know we are in a repository, and
   NULL when we are not, in a parameter.  The uses of the_repository
   variable in a few of them have been removed using the new calling
   convention.

 * The reftable sub-system grew a new reftable-specific strbuf
   replacement to reduce its dependency on Git-specific data
   structures.

 * The ref-filter machinery learns to recognize and avoid cases where
   sorting would be redundant.

 * Various platform compatibility fixes split out of the larger effort
   to use Meson as the primary build tool.

 * Treat ECONNABORTED the same as ECONNRESET in 'git credential-cache'
   to work around a possible Cygwin regression. This resolves a race
   condition caused by changes in Cygwin's handling of socket
   closures, allowing the client to exit cleanly when encountering
   ECONNABORTED.

 * Demonstrate an assertion failure in 'git mv'.

 * Documentation update to clarify that 'uploadpack.allowAnySHA1InWant'
   implies both 'allowTipSHA1InWant' and 'allowReachableSHA1InWant'.

 * Replace various calls to atoi() with strtol_i() and strtoul_ui(),
   and add improved error handling.

 * Documentation updates to 'git-update-ref(1)'.

 * Update the project's CodingGuidelines to discourage naming functions
   with a "_1()" suffix.

 * Updates the '.clang-format' to match project conventions.

 * Centralize documentation for repository extensions into a single place.

 * Buildfix and upgrade of Clar to a newer version.

 * Documentation mark-up updates.

 * Renaming a handful of variables and structure fields.

 * Fix for clar unit tests to support CMake build.

 * C23 compatibility updates.

 * GCC 15 compatibility updates.

 * We now ensure "index-pack" is used with the "--promisor" option
   only during a "git fetch".

 * The migration procedure between two ref backends has been optimized.

 * "git fsck" learned to issue warnings on "curiously formatted" ref
   contents that have always been taken valid but something Git
   wouldn't have written itself (e.g., missing terminating end-of-line
   after the full object name).

 * Work around Coverity warning that would not trigger in practice.

 * Built-in Git subcommands are supplied the repository object to work
   with; they learned to do the same when they invoke sub-subcommands.

 * Drop support for ancient environments in various CI jobs.

 * Isolates the reftable subsystem from the rest of Git's codebase by
   using fewer pieces of Git's infrastructure.

 * Optimize reading random references out of the reftable backend by
   allowing reuse of iterator objects.

 * Backport oss-fuzz tests for us to our codebase.

 * Introduce a new repository extension to prevent older Git versions
   from mis-interpreting worktrees created with relative paths.

 * Yet another "pass the repository through the callchain" topic.

 * "git describe" learned to stop digging the history needlessly
   deeper.

 * Build procedure update plus introduction of Meson based builds.

 * Recent reftable updates mistook a NULL return from a request for
   0-byte allocation as OOM and died unnecessarily, which has been
   corrected.

 * Reftable backend adds check for upper limit of log's update_index.

 * Start working to make the codebase buildable with -Wsign-compare.

 * Regression fix for 'show-index' when run outside of a repository.

 * The meson-build procedure is integrated into CI to catch and
   prevent bitrotting.

 * "git refs migrate" learned to also migrate the reflog data across
   backends.

 * The developer documentation has been updated to give the latest
   info on gitk and git-gui maintainer.


 * CI jobs that run threaded programs under LSan has been giving false
   positives from time to time, which has been worked around.


Fixes since v2.47
-----------------

 * Doc update to clarify how periodical maintenance are scheduled,
   spread across time to avoid thundering hurds.

 * Use after free and double freeing at the end in "git log -L... -p"
   had been identified and fixed.

 * On macOS, fsmonitor can fall into a race condition that results in
   a client waiting forever to be notified for an event that have
   already happened.  This problem has been corrected.

 * "git maintenance start" crashed due to an uninitialized variable
   reference, which has been corrected.

 * Fail gracefully instead of crashing when attempting to write the
   contents of a corrupt in-core index as a tree object.

 * A "git fetch" from the superproject going down to a submodule used
   a wrong remote when the default remote names are set differently
   between them.

 * Fixes compile time warnings with 64-bit MSVC.

 * Teaches 'shortlog' to explicitly use SHA-1 when operating outside
   of a repository.

 * Fix 'git grep' regression on macOS by disabling lookahead when
   encountering invalid UTF-8 byte sequences.

 * The dumb-http code regressed when the result of re-indexing a pack
   yielded an *.idx file that differs in content from the *.idx file
   it downloaded from the remote. This has been corrected by no longer
   relying on: the *.idx file we got from the remote.

 * When called with '--left-right' and '--use-bitmap-index', 'rev-list'
   will produce output without any left/right markers, which has been
   corrected.

 * More leakfixes.

 * Test modernization.

 * The "--shallow-exclude=<ref>" option to various history transfer
   commands takes a ref, not an arbitrary revision.

 * A regression where commit objects missing from a commit-graph can
   cause an infinite loop when doing a fetch in a partial clone has
   been fixed.

 * The MinGW compatibility layer has been taught to support POSIX
   semantics for atomic renames when other process(es) have a file
   opened at the destination path.

 * "git gc" discards any objects that are outside promisor packs that
   are referred to by an object in a promisor pack, and we do not
   refetch them from the promisor at runtime, resulting an unusable
   repository.  Work it around by including these objects in the
   referring promisor pack at the receiving end of the fetch.

 * Avoid build/test breakage on a system without working malloc debug
   support dynamic library.
   (merge 72ad6dc368 jk/test-malloc-debug-check later to maint).

 * Double-free fix.
   (merge fe17a25905 jk/fetch-prefetch-double-free-fix later to maint).

 * Use of some uninitialized variables in "git difftool" has been
   corrected.

 * Object reuse code based on multi-pack-index sent an unwanted copy
   of object.
   (merge e199290592 tb/multi-pack-reuse-dupfix later to maint).

 * "git fast-import" can be tricked into a replace ref that maps an
   object to itself, which is a useless thing to do.
   (merge 5e904f1a4a en/fast-import-avoid-self-replace later to maint).

 * The ref-transaction hook triggered for reflog updates, which has
   been corrected.
   (merge b886db48c6 kn/ref-transaction-hook-with-reflog later to maint).

 * Give a bit of advice/hint message when "git maintenance" stops finding a
   lock file left by another instance that still is potentially running.
   (merge ba874d1dac ps/gc-stale-lock-warning later to maint).

 * Use the right helper program to measure file size in performance tests.
   (merge 3f97f1bce6 tb/use-test-file-size-more later to maint).

 * A double-free that may not trigger in practice by luck has been
   corrected in the reference resolution code.
   (merge b6318cf23a sj/refs-symref-referent-fix later to maint).

 * The sequencer failed to honor core.commentString in some places.

 * Describe a case where an option value needs to be spelled as a
   separate argument, i.e. "--opt val", not "--opt=val".
   (merge 1bc1e94091 jc/doc-opt-tilde-expand later to maint).

 * Loosen overly strict ownership check introduced in the recent past,
   to keep the promise "cloning a suspicious repository is a safe
   first step to inspect it".
   (merge 0ffb5a6bf1 bc/allow-upload-pack-from-other-people later to maint).

 * "git fast-import" learned to reject paths with ".."  and "." as
   their components to avoid creating invalid tree objects.
   (merge 8cb4c6e62f en/fast-import-verify-path later to maint).

 * The --ancestry-path option is designed to be given a commit that is
   on the path, which was not documented, which has been corrected.
   (merge bc1a980759 kk/doc-ancestry-path later to maint).


 * "git tag" has been taught to refuse to create refs/tags/HEAD
   as such a tag will be confusing in the context of UI provided by
   the Git Porcelain commands.
   (merge bbd445d5ef jc/forbid-head-as-tagname later to maint).

 * The advice messages now tell the newer 'git config set' command to
   set the advice.token configuration variable to squelch a message.
   (merge 6c397d0104 bf/explicit-config-set-in-advice-messages later to maint).

 * The syntax ":/<text>" to name the latest commit with the matching
   text was broken with a recent change, which has been corrected.
   (merge 0ff919e87a ps/commit-with-message-syntax-fix later to maint).

 * Fix performance regression of a recent "fatten promisor pack with
   local objects" protection against an unwanted gc.

 * "git log -p --remerge-diff --reverse" was completely broken.
   (merge f94bfa1516 js/log-remerge-keep-ancestry later to maint).

 * "git bundle create" with an annotated tag on the positive end of
   the revision range had a workaround code for older limitation in
   the revision walker, which has become unnecessary.
   (merge dd1072dfa8 tc/bundle-with-tag-remove-workaround later to maint).

 * GitLab CI updates.
   (merge c6b43f663e ps/ci-gitlab-update later to maint).

 * Code to reuse objects based on bitmap contents have been tightened
   to avoid race condition even when multiple packs are involved.
   (merge 62b3ec8a3f tb/bitmap-fix-pack-reuse later to maint).

 * An earlier "csum-file checksum does not have to be computed with
   sha1dc" topic had a few code paths that had initialized an
   implementation of a hash function to be used by an unmatching hash
   by mistake, which have been corrected.
   (merge 599a63409b ps/weak-sha1-for-tail-sum-fix later to maint).

 * Other code cleanup, docfix, build fix, etc.
   (merge 77af53f56f aa/t7300-modernize later to maint).
   (merge dcd590a39d bf/t-readme-mention-reftable later to maint).
   (merge 68e3c69efa kh/trailer-in-glossary later to maint).
   (merge 91f88f76e6 tb/boundary-traversal-fix later to maint).
   (merge 168ebb7159 jc/doc-error-message-guidelines later to maint).
   (merge 18693d7d65 kh/doc-bundle-typofix later to maint).
   (merge e2f5d3b491 kh/doc-update-ref-grammofix later to maint).
   (merge 8525e92886 mh/doc-windows-home-env later to maint).
