Git v2.47 Release Notes
=======================

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

 * Many Porcelain commands that internally use the merge machinery
   were taught to consistently honor the diff.algorithm configuration.

 * A few descriptions in "git show-ref -h" have been clarified.

 * A 'P' command to "git add -p" that passes the patch hunk to the
   pager has been added.

 * "git grep -W" omits blank lines that follow the found function at
   the end of the file, just like it omits blank lines before the next
   function.

 * The value of http.proxy can have "path" at the end for a socks
   proxy that listens to a unix-domain socket, but we started to
   discard it when we taught proxy auth code path to use the
   credential helpers, which has been corrected.

 * The code paths to compact multiple reftable files have been updated
   to correctly deal with multiple compaction triggering at the same
   time.

 * Support to specify ref backend for submodules has been enhanced.

 * "git svn" has been taught about svn:global-ignores property
   recent versions of Subversion has.

 * The default object hash and ref backend format used to be settable
   only with explicit command line option to "git init" and
   environment variables, but now they can be configured in the user's
   global and system wide configuration.

 * "git send-email" learned "--translate-aliases" option that reads
   addresses from the standard input and emits the result of applying
   aliases on them to the standard output.

 * 'git for-each-ref' learned a new "--format" atom to find the branch
   that the history leading to a given commit "%(is-base:<commit>)" is
   likely based on.

 * The command line prompt support used to be littered with bash-isms,
   which has been corrected to work with more shells.

 * Support for the RUNTIME_PREFIX feature has been added to z/OS port.

 * "git send-email" learned "--mailmap" option to allow rewriting the
   recipient addresses.

 * "git mergetool" learned to use VSCode as a merge backend.

 * "git pack-redundant" has been marked for removal in Git 3.0.

 * One-line messages to "die" and other helper functions will get LF
   added by these helper functions, but many existing messages had an
   unnecessary LF at the end, which have been corrected.

 * The "scalar clone" command learned the "--no-tags" option.

 * The environment GIT_ADVICE has been intentionally kept undocumented
   to discourage its use by interactive users.  Add documentation to
   help tool writers.

 * "git apply --3way" learned to take "--ours" and other options.


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

 * A build tweak knob has been simplified by not setting the value
   that is already the default; another unused one has been removed.

 * A CI job that use clang-format to check coding style issues in new
   code has been added.

 * The reviewing guidelines document now explicitly encourages people
   to give positive reviews and how.

 * Test script linter has been updated to catch an attempt to use
   one-shot export construct "VAR=VAL func" for shell functions (which
   does not work for some shells) better.

 * Some project conventions have been added to CodingGuidelines.

 * In the refs subsystem, implicit reliance of the_repository has been
   eliminated; the repository associated with the ref store object is
   used instead.

 * Various tests in reftable library have been rewritten using the unit test
   framework.

 * A test that fails on an unusually slow machine was found, and made
   less likely to cause trouble by lengthening the expiry value it
   uses.

 * An existing test of hashmap API has been rewritten with the
   unit-test framework.

 * A policy document that describes platform support levels and
   expectation on platform stakeholders has been introduced.

 * The refs API has been taught to give symref target information to
   the users of ref iterators, allowing for-each-ref and friends to
   avoid an extra ref_resolve_* API call per a symbolic ref.

 * Unit-test framework has learned a simple control structure to allow
   embedding test statements in-line instead of having to create a new
   function to contain them.

 * Incremental updates of multi-pack index files is getting worked on.

 * Use of API functions that implicitly depend on the_repository
   object in the config subsystem has been rewritten to pass a
   repository object through the callchain.

 * Unused parameters have been either marked as UNUSED to squelch
   -Wunused warnings or dropped from many functions..

 * The code in the reftable library has been cleaned up by discarding
   unused "generic" interface.

 * The underlying machinery for "git diff-index" has long been made to
   expand the sparse index as needed, but the command fully expanded
   the sparse index upfront, which now has been taught not to do.

 * More trace2 events at key points on push and fetch code paths have
   been added.

 * Make our codebase compilable with the -Werror=unused-parameter
   option.

 * "git cat-file" works well with the sparse-index, and gets marked as
   such.

 * CI started failing completely for linux32 jobs, as the step to
   upload failed test directory uses GitHub actions that is deprecated
   and is now disabled.

 * Import clar unit tests framework libgit2 folks invented for our
   use.

 * The error messages from the test script checker have been improved.

 * The convention to calling into built-in command implementation has
   been updated to pass the repository, if known, together with the
   prefix value.

 * "git apply" had custom buffer management code that predated before
   use of strbuf got widespread, which has been updated to use strbuf,
   which also plugged some memory leaks.

 * The reftable backend learned to more efficiently handle exclude
   patterns while enumerating the refs.

 * CI updates.  FreeBSD image has been updated to 13.4.
   (merge 2eeb29702e cb/ci-freebsd-13-4 later to maint).

 * Give timeout to the locking code to write to reftable, instead of
   failing on the first failure without retrying.

 * The checksum at the tail of files are now computed without
   collision detection protection.  This is safe as the consumer of
   the information to protect itself from replay attacks checks for
   hash collisions independently.


Fixes since v2.46
-----------------

 * "git add -p" by users with diff.suppressBlankEmpty set to true
   failed to parse the patch that represents an unmodified empty line
   with an empty line (not a line with a single space on it), which
   has been corrected.

 * "git checkout --ours" (no other arguments) complained that the
   option is incompatible with branch switching, which is technically
   correct, but found confusing by some users.  It now says that the
   user needs to give pathspec to specify what paths to checkout.

 * It has been documented that we avoid "VAR=VAL shell_func" and why.

 * "git rebase --help" referred to "offset" (the difference between
   the location a change was taken from and the change gets replaced)
   incorrectly and called it "fuzz", which has been corrected.

 * "git notes add -m '' --allow-empty" and friends that take prepared
   data to create notes should not invoke an editor, but it started
   doing so since Git 2.42, which has been corrected.

 * An expensive operation to prepare tracing was done in re-encoding
   code path even when the tracing was not requested, which has been
   corrected.

 * More leakfixes.

 * The credential helper to talk to OSX keychain sometimes sent
   garbage bytes after the username, which has been corrected.

 * A recent update broke "git ls-remote" used outside a repository,
   which has been corrected.

 * The patch parser in 'git apply' has been a bit more lenient against
   unexpected mode bits, like 100664, recorded on extended header lines.

 * "git config --value=foo --fixed-value section.key newvalue" barfed
   when the existing value in the configuration file used the
   valueless true syntax, which has been corrected.

 * The patch parser in "git patch-id" has been tightened to avoid
   getting confused by lines that look like a patch header in the log
   message.

 * "git reflog expire" failed to honor annotated tags when computing
   reachable commits.

 * A flakey test and incorrect calls to strtoX() functions have been
   fixed.

 * Follow-up on 2.45.1 regression fix.

 * "git rev-list ... | git diff-tree -p --remerge-diff --stdin" should
   behave more or less like "git log -p --remerge-diff" but instead it
   crashed, forgetting to prepare a temporary object store needed.

 * "git bundle unbundle" outside a repository triggered a BUG()
   unnecessarily, which has been corrected.

 * Maintenance tasks other than "gc" now properly go background when
   "git maintenance" runs them.

 * We created a useless pseudo-merge reachability bitmap that is about
   0 commits, and attempted to include commits that are not in packs,
   which made no sense.  These bugs have been corrected.
   (merge a72dfab8b8 tb/pseudo-merge-bitmap-fixes later to maint).

 * "git rebase -x --quiet" was not quiet, which was corrected.

 * The code path for compacting reftable files saw some bugfixes
   against concurrent operation.

 * The code forgot to discard unnecessary in-core commit buffer data
   for commits that "git log --skip=<number>" traversed but omitted
   from the output, which has been corrected.

 * "git verify-pack" and "git index-pack" started dying outside a
   repository, which has been corrected.

 * A data corruption bug when multi-pack-index is used and the same
   objects are stored in multiple packfiles has been corrected.

 * "git pack-refs --auto" for the files backend was too aggressive,
   which has been a bit tamed.
   (merge c3459ae9ef ps/pack-refs-auto-heuristics later to maint).

 * A file descriptor left open is now properly closed when "git
   sparse-checkout" updates the sparse patterns.

 * In a few corner cases "git diff --exit-code" failed to report
   "changes" (e.g., renamed without any content change), which has
   been corrected.

 * Cygwin does have /dev/tty support that is needed by things like
   single-key input mode.

 * The interpret-trailers command failed to recognise the end of the
   message when the commit log ends in an incomplete line.

 * "git rebase --autostash" failed to resurrect the autostashed
   changes when the command gets aborted after giving back control
   asking for hlep in conflict resolution.
   (merge bf6ab087d1 pw/rebase-autostash-fix later to maint).

 * The "imap-send" now allows to be compiled with NO_OPENSSL and
   OPENSSL_SHA1 defined together.
   (merge 997950a750 jk/no-openssl-with-openssl-sha1 later to maint).

 * The support to customize build options to adjust for older versions
   and/or older systems for the interop tests has been improved.
   (merge 22ef5f02a8 jk/interop-test-build-options later to maint).

 * Update the character width table for Unicode 16.
   (merge 44dc651132 bb/unicode-width-table-16 later to maint).

 * In Git 2.39, Git.pm stopped working in a bare repository, which has
   been corrected.
   (merge d3edb0bdde jk/git-pm-bare-repo-fix later to maint).

 * When a remote-helper dies before Git writes to it, SIGPIPE killed
   Git silently.  We now explain the situation a bit better to the end
   user in our error message.
   (merge 6e7fac9bca jk/diag-unexpected-remote-helper-death later to maint).

 * A few usability fixes to "git jump" (in contrib/).
   (merge 083b82544d jk/jump-quickfix-fixes later to maint).

 * "git diff --exit-code" ignored modified binary files, which has
   been corrected.
   (merge 9a41735af6 rs/diff-exit-code-binary later to maint).

 * When a subprocess to work in a submodule spawned by "git submodule"
   fails with SIGPIPE, the parent Git process caught the death of it,
   but gave a generic "failed to work in that submodule", which was
   misleading.  We now behave as if the parent got SIGPIPE and die.
   (merge 082caf527e pw/submodule-process-sigpipe later to maint).

 * "git archive" with pathspec magic that uses the attribute
   information did not work well, which has been corrected.
   (merge 296743a7ca rs/archive-with-attr-pathspec-fix later to maint).

 * Background tasks "git maintenance" runs may need to use credential
   information when going over the network, but a credential helper
   may work only in an interactive environment, and end up blocking a
   scheduled task waiting for UI.  Credential helpers can now behave
   differently when they are not running interactively.
   (merge b9183b0a02 ds/background-maintenance-with-credential later to maint).

 * "git --git-dir=nowhere cmd" failed to properly notice that it
   wasn't in any repository while processing includeIf.onbranch
   configuration and instead crashed.

 * When "git sparse-checkout disable" turns a sparse checkout into a
   regular checkout, the index is fully expanded.  This totally
   expected behaviour however had an "oops, we are expanding the
   index" advice message, which has been corrected.
   (merge 537e516a39 ds/sparse-checkout-expansion-advice later to maint).

 * macOS with fsmonitor daemon can hang forever when a submodule is
   involved, which has been corrected.

 * Other code cleanup, docfix, build fix, etc.
   (merge be10ac7037 jc/mailinfo-header-cleanup later to maint).
   (merge 4460e052e0 jc/range-diff-lazy-setup later to maint).
   (merge 0627c58e7a ak/typofixes later to maint).
   (merge 83799f1500 jk/t9001-deflake later to maint).
   (merge e02cc08a88 ak/typofix-2.46-maint later to maint).
   (merge 5c5d29e1c4 ps/ci-gitlab-upgrade later to maint).
   (merge 9c4c840901 jc/doc-discarding-stalled-topics later to maint).
   (merge 5e6f359f6b ds/read-cache-mempool-leakfix later to maint).
