Git v2.54 Release Notes
=======================

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

 * "git add -p" and friends note what the current status of the hunk
   being shown is.

 * "git history" history rewriting (experimental) command has been
   added.

 * "git replay" is taught to drop commits that become empty (not the
   ones that are empty in the original).

 * The help text and the documentation for the "--expire" option of
   "git worktree [list|prune]" have been improved.

 * When "git show-index" is run outside a repository, it silently
   defaults to SHA-1; the tool now warns when this happens.

 * "git merge-file" can be run outside a repository, but it ignored
   all configuration, even the per-user ones.  The command now uses
   available configuration files to find its customization.

 * "auto filter" logic for large-object promisor remote.

 * "git rev-list" and friends learn "--maximal-only" to show only the
   commits that are not reachable by other commits.

 * Command line completion (in contrib/) update for
   "stash import/export".

 * "git repo info" learns "--keys" action to list known keys.

 * Extend the alias configuration syntax to allow aliases using
   characters outside ASCII alphanumeric (plus '-').

 * A signature on a commit that was GPG signed long time ago ought to
   be still valid after the key that was used to sign it has expired,
   but we showed them in alarming red.

 * "git subtree split --prefix=P <commit>" now checks the prefix P
   against the tree of the (potentially quite different from the
   current working tree) given commit.

 * "git add -p" learned a new mode that allows the user to revisit a
   file that was already dealt with.

 * Allow the directory in which reference backends store their data to
   be specified.

 * "gitweb" has been taught to be mobile friendly.

 * "git apply --directory=./un/../normalized/path" now normalizes the
   given path before using it.

 * "git maintenance" starts using the "geometric" strategy by default.

 * "git config list" is taught to show the values interpreted for
   specific type with "--type=<X>" option.

 * "git add <submodule>" has been taught to honor
   submodule.<name>.ignore that is set to "all" (and requires "git add
   -f" to override it).

 * Hook commands are now allowed to be defined (possibly centrally)
   in the configuration files, and run multiple of them for the same
   hook event.


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

 * Avoid local submodule repository directory paths overlapping with
   each other by encoding submodule names before using them as path
   components.

 * The string_list API gains a new helper, string_list_sort_u(), and
   new unit tests to extend coverage.

 * Improve set-up time of a perf test.

 * ISO C23 redefines strchr and friends that tradiotionally took
   a const pointer and returned a non-const pointer derived from it to
   preserve constness (i.e., if you ask for a substring in a const
   string, you get a const pointer to the substring).  Update code
   paths that used non-const pointer to receive their results that did
   not have to be non-const to adjust.

 * Rename three functions around the commit_list data structure.

 * Transaction to create objects (or not) is currently tied to the
   repository, but in the future a repository can have multiple object
   sources, which may have different transaction mechanisms.  Make the
   odb transaction API per object source.

 * "git merge-ours" is taught to work better in a sparse checkout.

 * Allow recording process ID of the process that holds the lock next
   to a lockfile for diagnosis.

 * Reduce dependency on the_repository of xdiff-interface layer.

 * Code clean-up to use the commit_stack API.

 * "git diff --anchored=<text>" has been optimized.

 * A CodingGuidelines update.

 * Add process ancestry data to trace2 on macOS to match what we
   already do on Linux and Windows.  Also adjust the way Windows
   implementation reports this information to match the other two.

 * A handful of places used refs_for_each_ref_in() API incorrectly,
   which has been corrected.

 * Some tests assumed "iconv" is available without honoring ICONV
   prerequisite, which has been corrected.

 * Revamp object enumeration API around odb.

 * Additional tests were introduced to see the interaction with netrc
   auth with auth failure on the http transport.

 * A couple of bugs in use of flag bits around odb API has been
   corrected, and the flag bits reordered.

 * Plumb gitk/git-gui build and install procedure in meson based
   builds.

 * The code to accept shallow "git push" has been optimized.

 * Simplify build procedure for oxskeychain (in contrib/).

 * Fix dependency screw-up in meson-based builds.

 * Wean the mailmap code off of the_repository dependency.

 * API clean-up for the worktree subsystem.

 * The last uses of the_repository in "tree-diff.c" have been
   eradicated.

 * Clean-up the code around "git repo info" command.

 * Mark the merge-ort codebase to prevent more uses of the_repository
   from getting added.

 * The core.attributesfile is intended to be set per repository, but
   were kept track of by a single global variable in-core, which has
   been corrected by moving it to per-repository data structure.

 * Use the hook API to replace ad-hoc invocation of hook scripts via
   the run_command() API.

 * Code refactoring around refs-for-each-* API functions.

 * The parse-options API learned to notice an options[] array with
   duplicated long options.
   (merge 237e520d81 rs/parse-options-duplicated-long-options later to maint).


Fixes since v2.53
-----------------

 * HTTP transport failed to authenticate in some code paths, which has
   been corrected.
   (merge ed0f7a62f7 ap/http-probe-rpc-use-auth later to maint).

 * The computation of column width made by "git diff --stat" was
   confused when pathnames contain non-ASCII characters.
   (merge 04f5d95ef7 lp/diff-stat-utf8-display-width-fix later to maint).

 * The "-z" and "--max-depth" documentation (and implementation of
   "-z") in the "git last-modified" command have been updated.
   (merge 9dcc09bed1 tc/last-modified-options-cleanup later to maint).

 * A handful of code paths that started using batched ref update API
   (after Git 2.51 or so) lost detailed error output, which have been
   corrected.
   (merge eff9299eac kn/ref-batch-output-error-reporting-fix later to maint).

 * "git blame --ignore-revs=... --color-lines" did not account for
   ignored revisions passing blame to the same commit an adjacent line
   gets blamed for.
   (merge d519082d4e rs/blame-ignore-colors-fix later to maint).

 * Coccinelle rules update.
   (merge 60614838a4 tc/memzero-array later to maint).

 * Giving "git last-modified" a tree (not a commit-ish) died an
   uncontrolled death, which has been corrected.
   (merge 525ef52301 tc/last-modified-not-a-tree later to maint).

 * Test contrib/ things in CI to catch breakages before they enter the
   "next" branch.
   (merge c591c3ceff jc/ci-test-contrib-too later to maint).

 * A handful of documentation pages have been modernized to use the
   "synopsis" style.
   (merge a34d1d53a6 ja/doc-synopsis-style-even-more later to maint).

 * Small clean-up of xdiff library to remove unnecessary data
   duplication.
   (merge 5086213bd2 pw/xdiff-cleanups later to maint).

 * Update sample commit-msg hook to complain when a log message has
   material mailinfo considers the end of log message in the middle.
   (merge 83804c361b pw/commit-msg-sample-hook later to maint).

 * "git pack-objects --stdin-packs" with "--exclude-promisor-objects"
   fetched objects that are promised, which was not wanted.  This has
   been fixed.
   (merge f4eff7116d ps/pack-concat-wo-backfill later to maint).

 * "git switch <name>", in an attempt to create a local branch <name>
   after a remote tracking branch of the same name gave an advise
   message to disambiguate using "git checkout", which has been
   updated to use "git switch".
   (merge 12fee11f21 jc/checkout-switch-restore later to maint).

 * It does not make much sense to apply the "incomplete-line"
   whitespace rule to symbolic links, whose contents almost always
   lack the final newline.  "git apply" and "git diff" are now taught
   to exclude them for a change to symbolic links.
   (merge 6a41481c6d jc/whitespace-incomplete-line later to maint).

 * "git format-patch --from=<me>" did not honor the command line
   option when writing out the cover letter, which has been corrected.

 * Update build precedure for mergetool documentation in meson-based builds.
   (merge 58e4eeeeb5 pw/meson-doc-mergetool later to maint).

 * An earlier attempt to optimize "git subtree" discarded too much
   relevant histories, which has been corrected.

 * A prefetch call can be triggered to access a stale diff_queue entry
   after diffcore-break breaks a filepair into two and freed the
   original entry that is no longer used, leading to a segfault, which
   has been corrected.
   (merge 2d88ab078d hy/diff-lazy-fetch-with-break-fix later to maint).

 * "git fetch --deepen" that tries to go beyond merged branch used to
   get confused where the updated shallow points are, which has been
   corrected.
   (merge 3ef68ff40e sp/shallow-deepen-relative-fix later to maint).

 * "fsck" iterates over packfiles and its access to pack data caused
   the list to be permuted, which caused it to loop forever; the code
   to access pack data by "fsck" has been updated to avoid this.
   (merge 13eb65d366 ps/fsck-stream-from-the-right-object-instance later to maint).

 * "git log --graph --stat" did not count the display width of colored
   graph part of its own output correctly, which has been corrected.
   (merge 064b869efc lp/diff-stat-utf8-display-width-fix later to maint).

 * The configuration variable format.noprefix did not behave as a
   proper boolean variable, which has now been fixed and documented.
   (merge ea3a62c40e kh/format-patch-noprefix-is-boolean later to maint).

 * CI fix.
   (merge eb35167dd4 ps/ci-reduce-gitlab-envsize later to maint).

 * "git diff --no-index --find-object=<object-name>" outside a
   repository of course wouldn't be able to find the object and died
   while parsing the command line.  The command is made to die in a
   bit more user-friendly way.
   (merge b0ddc7947c mm/diff-no-index-find-object later to maint).

 * Fix typo-induced breakages in fsmonitor-watchman sample hook.
   (merge 41366e4677 pt/fsmonitor-watchman-sample-fix later to maint).

 * Other code cleanup, docfix, build fix, etc.
   (merge d79fff4a11 jk/remote-tracking-ref-leakfix later to maint).
   (merge 7a747f972d dd/t5403-modernise later to maint).
   (merge 81021871ea sp/myfirstcontribution-include-update later to maint).
   (merge 49223593fd ac/sparse-checkout-string-list-cleanup later to maint).
   (merge a824421d36 sp/t5500-cleanup later to maint).
   (merge df1c5d7ed7 kh/doc-shortlog-fix later to maint).
   (merge 2d45507f15 am/doc-github-contributiong-link-to-submittingpatches later to maint).
   (merge 68060b9262 hs/t9160-test-paths later to maint).
   (merge 486386c687 cs/subtree-reftable-testfix later to maint).
   (merge 0728012c53 jc/diff-highlight-main-master-testfix later to maint).
   (merge 831989ef38 mc/doc-send-email-signed-off-by-cc later to maint).
   (merge c44b3f3203 sd/doc-my1c-api-config-reference-fix later to maint).
   (merge 6c21e53bad rs/version-wo-the-repository later to maint).
   (merge 10c68d2577 rs/clean-includes later to maint).
   (merge 168d575719 bk/t2003-modernise later to maint).
   (merge 6bfef81c9a kh/doc-rerere-options-xref later to maint).
   (merge aaf3cc3d8d sd/t7003-test-path-is-helpers later to maint).
   (merge 2668b6bdc4 jc/doc-rerere-update later to maint).
   (merge 2f99f50f2d jc/doc-cg-c-comment later to maint).
   (merge a454cdca42 kh/doc-am-format-sendmail later to maint).
   (merge 8b0061b5c5 jk/ref-filter-lrstrip-optim later to maint).
   (merge 5133837392 ps/ci-gitlab-msvc-updates later to maint).
   (merge 143e84958c db/doc-fetch-jobs-auto later to maint).
   (merge 0678e01f02 ap/use-test-seq-f-more later to maint).
   (merge 96286f14b0 ty/symlinks-use-unsigned-for-bitset later to maint).
   (merge b10e0cb1f3 kh/doc-am-xref later to maint).
   (merge ed84bc1c0d kh/doc-patch-id-4 later to maint).
   (merge 7451864bfa sc/pack-redundant-leakfix later to maint).
   (merge f87593ab1a cx/fetch-display-ubfix later to maint).
   (merge a66c8c7f91 jk/repo-structure-cleanup later to maint).
   (merge 5ee8782f87 ss/test-that-that-typofix later to maint).
   (merge f31b322008 fp/t3310-test-path-is-helpers later to maint).
