Git v2.56 Release Notes
=======================

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

 * Advice shown by "git status" when the local branch is behind or has
   diverged from its push branch has been updated to suggest "git pull
   <remote> <branch>".

 * The handling of promisor-remote protocol capability has been updated
   to allow the other side to add to the list of promisor remotes via the
   'promisor.acceptFromServerURL' configuration variable.

 * The 'ort' merge backend has been hardened against corrupt trees by
   ensuring it aborts under appropriate error conditions.

 * The `fetch.followRemoteHEAD` configuration variable has been added to
   provide a default for the per-remote `remote.<name>.followRemoteHEAD`
   setting.

 * "git log --follow" has been updated to better handle non-linear
   history, in which the path being tracked gets renamed differently in
   multiple history lines.

 * The "git repo info" command has been taught new keys to output both
   absolute and relative paths for "gitdir" and "commondir", supported by
   a new path-formatting helper extracted from "git rev-parse".

 * When 'git push origin/main' or 'git branch origin main' is run, the
   command is now recognized as a potential typo, and advice has been
   added to offer a typo fix.

 * The 'git refs' toolbox has been extended with new 'create', 'delete',
   'update', and 'rename' subcommands to create, delete, update, and
   rename references, respectively.

 * The experimental 'git history' command has been taught a new 'drop'
   subcommand to remove a commit, with its descendants replayed onto its
   parent.

 * The alignment of commit object name abbreviations in 'git blame'
   output has been optimized to reserve a column for marks (caret,
   question mark, or asterisk) only when such marks are actually shown.

 * Option parsing with 'git rev-parse --parseopt' and in most 'git'
   subcommands has been updated to exit with 0 (instead of 129) when the
   help option ('-h' or '--help') is requested directly by the user,
   aligning with standard Unix convention.

 * The '[includeIf "condition"]' conditional inclusion facility for
   configuration files has been taught to use the location of the
   worktree in its condition.

 * The usage string and SYNOPSIS for 'git fast-export' have been
   standardized to make them consistent with each other and with other
   commands.

 * 'git log --graph' has been modified to visually distinguish parentless
   'root' commits (and commits that become roots due to history
   simplification) by indenting them, preventing them from appearing
   falsely related to unrelated commits rendered immediately above them.


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

 * The refactoring of 'setup.c' has been continued to drop remaining
   global state (`git_work_tree_cfg`, `is_bare_repository_cfg`), updating
   `is_bare_repository()` to no longer implicitly rely on
   `the_repository`.

 * Project-specific configuration for b4 has been introduced, and the
   documentation has been updated to recommend using it as a
   streamlined method for submitting patches.

 * The default format path of git cat-file --batch has been optimized
   to use strbuf_add_oid_hex() and strbuf_add_uint() instead of
   strbuf_addf(), yielding a noticeable speedup.

 * Commands that list branches and tags (like git branch and git tag)
   have been optimized to pass the namespace prefix when initializing
   their ref iterator, avoiding a loose-ref scaling regression in
   repositories with many unrelated loose references.

 * The packed object source has been refactored into a proper struct
   odb_source.

 * The global configuration variables protect_hfs and protect_ntfs have
   been migrated into struct repo_config_values to tie them to
   per-repository configuration state.

 * The trailer sections in SubmittingPatches have been updated to
   encourage use of standard trailers.

 * The documentation in SubmittingPatches has been updated to clarify how
   patch contributors should respond to design and viability critiques,
   and how the resolution of such critiques should be recorded in the
   final commit messages.

 * The pack-objects command has been updated to support reachability
   bitmaps and delta-islands concurrently with the `--path-walk` option,
   allowing faster packaging by falling back to path-walk when bitmaps
   cannot fully satisfy the request.

 * Documentation on community contribution guidelines has been updated to
   encourage replying to review comments before rerolling, and to advise
   a default limit of at most one reroll per day to give reviewers across
   different time zones enough time to participate.

 * The lazy priority queue optimization pattern (deferring actual removal
   in 'prio_queue_get()' to allow get+put fusion) has been folded
   directly into 'prio_queue' itself, speeding up commit traversal
   workflows and simplifying callers.

 * The 'reprepare()' callback for object database sources has been
   generalized into a 'prepare()' callback with an optional flush cache
   flag, and a new 'odb_prepare()' wrapper has been introduced to allow
   pre-opening object database sources.

 * The 'whence' field in 'struct object_info' has been removed.  The
   backend-specific object information retrieval has been refactored into
   an opt-in 'struct object_info_source' structure.

 * A racy build failure under Meson has been corrected by ensuring that
   the generated header file 'hook-list.h' is built before compiling
   files in 'builtin_sources' that depend on it.

 * The repository discovery and repository configuration phases, which
   were previously intertwined in 'setup.c', have been split.  Repository
   discovery has been updated to populate a 'struct repo_discovery'
   without modifying the repository state, which is then taken by
   repository configuration to initialize the repository, paving the way
   for clean unification of repository configuration.

 * The 'SubmittingPatches' document has been updated to explicitly
   describe the expectation for contributors to retract or abandon their
   patch series when they are no longer pursuing it.

 * The contributor guide has been updated to advise new contributors to
   trim irrelevant quoted text when replying to review comments, matching
   the existing advice given to reviewers.

 * The build system has been updated to support building universal macOS
   binaries when 'Rust' is enabled, by compiling separate static archives
   for each target triple listed in 'RUST_TARGETS' and combining them
   using the macOS 'lipo' tool.  The 'git-credential-osxkeychain' helper
   has been updated to link against '$(RUST_LIB)' when 'Rust' is enabled.

 * The test suite has been updated to use the 'test_grep' helper instead
   of bare 'grep' for test assertions, allowing file contents to be
   printed on failure for easier debugging.  A new 'greplint' linter has
   been introduced to detect and prevent new bare 'grep' assertions from
   being added to the test suite.

 * The pipelines in 't1410-reflog.sh' have been replaced with the
   'test_stdout_line_count' helper to avoid suppressing the exit code of
   'git' commands, ensuring failures are not hidden from the test suite.

 * The cache-scanning loop in 'next_cache_entry()' has been optimized
   to avoid rescanning already-unpacked index entries, preventing a
   quadratic performance slow-down when diffing the working tree
   against a commit with a pathspec matching early index entries.

 * The global configuration variable 'ignore_case' (representing the
   'core.ignorecase' configuration) has been migrated into 'struct
   repo_config_values' to tie it to a specific repository instance.

 * The performance of ref updates and reads using the 'reftable' backend
   in the presence of many deletion tombstone records has been optimized
   by removing the tombstone suppression flag from the merged iterator
   and instead skipping tombstones at higher-level call sites where
   iteration bounds are known.

 * Various code paths have been hardened against potential NULL-pointer
   dereferences and invalid file descriptor accesses flagged by
   Coverity.

 * The in-tree 'b4' cover letter template has been updated to include the
   'change-id' trailer, ensuring that sent tags generated by 'b4' contain
   the required tracking information for subsequent runs.

 * 'git receive-pack' has been refactored to use ODB transaction
   interfaces instead of directly managing 'tmp_objdir' for staging
   incoming objects, bringing it closer to being ODB backend agnostic.

 * The test script 't/t9811-git-p4-label-import.sh' has been
   modernized to use 'test_path_is_file' and 'test_path_is_missing'
   instead of raw 'test -f' and '! test -f' calls.

 * A redundant strbuf_reset() call in the 'HAVE_GETDELIM' path of
   strbuf_getwholeline() has been removed, as getdelim() overwrites the
   buffer and the length is updated afterward.

 * The object database enumeration interface odb_for_each_object() has
   been taught to accept object filters, allowing the underlying backends
   to optimize the traversal by using reachability bitmaps when
   available.  'git cat-file --batch-all-objects' has been updated to use
   this generic interface, simplifying its code and avoiding direct
   access to ODB backend internals.

 * The test script 't/t1100-commit-tree-options.sh' has been modernized
   by converting test cases to the modern style (using single quotes and
   tab indentation) and moving the creation of the expected file inside
   the setup test so it runs under the protection of the test harness.

 * The test script 't/t7614-merge-signoff.sh' has been updated to avoid
   suppressing the exit code of 'git' commands in a pipe.

 * The 'git rev-list --no-walk' command has been corrected to restore
   pathspec filtering, which was lost when the streaming walk was
   refactored.

 * The ref subsystem and the worktree API have been refactored to pass a
   repository pointer down the call chain, allowing them to drop
   references to the global 'the_repository' variable.  As part of this,
   the handling of the 'core.packedRefsTimeout' configuration has been
   moved into the per-repository ref store structure.

 * 'git branch --contains' and 'git for-each-ref --contains' have been
   optimized to use the memoized commit traversal previously used only by
   'git tag --contains', significantly speeding up connectivity checks
   across many candidate refs with shared history.

 * The passing of push destination specifications in the 'remote-curl'
   helper has been simplified by removing the explicit 'count' parameter
   and relying on the NULL-termination of the array.

 * The dependency on the global 'the_repository' variable in the
   'refspec.c' API has been removed by passing the hash algorithm
   explicitly to refspec-parsing functions and storing it in 'struct
   refspec'.

 * The enumeration of untracked and ignored files in 'git status' has
   been optimized by avoiding quadratic complexity when inserting into
   string lists, reducing the construction cost from O(n^2) to O(n log
   n).

 * The copy_file() and copy_file_with_time() functions have been
   refactored to take a repository parameter, allowing the removal of the
   implicit dependency on the global 'the_repository' variable in
   'copy.c'.


Fixes since v2.55
-----------------

 * A regression in the error diagnosis code for invalid .git files has
   been fixed, avoiding a potential NULL-pointer crash when reporting
   that a .git file does not point to a valid repository.
   (merge 54a441bcea jk/setup-gitfile-diag-fix later to maint).

 * Support for hashing loose or packed objects larger than 4GB on Windows
   and other LLP64 platforms has been improved by converting object header
   buffers and data-handling functions from 'unsigned long' to 'size_t'.
   (merge d99e13d0be po/hash-object-size-t later to maint).

 * The display of the rebase todo list in "git status" has been
   improved to correctly abbreviate object IDs for more commands and
   avoid misinterpreting refs as object IDs.
   (merge 6f34e5f9e3 pw/status-rebase-todo later to maint).

 * Reference backend configuration has been updated to load lazily to
   avoid recursive calls during repository initialization when 'onbranch'
   configuration conditions are evaluated. This has also fixed a memory
   leak and allowed the unused `chdir_notify_reparent()` machinery to be
   dropped.
   (merge d6522d01df ps/refs-onbranch-fixes later to maint).

 * The connectivity check has been refactored to search for promisor
   objects in a generic way using the object database interface,
   rather than iterating packfiles directly. This allows connectivity
   checks to work properly in repositories that do not use packfiles.
   (merge 66ee9cb930 ps/connected-generic-promisor-checks later to maint).

 * A test checking interactions between git rebase --quit and
   autostash in t3420-rebase-autostash.sh has been corrected to use
   test_path_is_missing instead of ! grep on a file that shouldn't
   exist in the conflicted state.
   (merge eaad121fef sg/t3420-do-not-grep-in-missing-file later to maint).

 * The GPG and SSH signature parsing code has been corrected to strip
   carriage return characters only when they immediately precede line
   feeds, instead of unconditionally stripping all carriage returns.
   (merge 5dea8b690b ad/gpg-strip-cr-before-lf later to maint).

 * A memory leak in the 'reftable_writer_new()' initialization function
   has been fixed by delaying the allocation of 'struct reftable_writer'
   until after input options are validated.
   (merge c6fb3b9c3e jk/reftable-leakfix later to maint).

 * A memory leak in the '--base' handling of 'git format-patch' has been
   plugged, and the leak reporting of the test suite when running under a
   TAP harness has been improved.
   (merge 973a0373ff jk/format-patch-leakfix later to maint).

 * A write file stream resource leak has been fixed as part of a code
   cleanup.
   (merge ebb4d2ffa3 jc/history-message-prep-fix later to maint).

 * Various memory leaks in the Bloom-filter code paths that are exposed
   when running tests with the 'GIT_TEST_COMMIT_GRAPH_CHANGED_PATHS=1'
   environment variable have been plugged.
   (merge 459088ec2e jk/bloom-leak-fixes later to maint).

 * The wincred credential helper has been updated to avoid memory
   corruption when erasing credentials and to prevent silent
   credential loss when storing OAuth tokens, by correcting buffer
   allocations and arguments passed to safe-CRT APIs.
   (merge f635ab9ab4 js/wincred-fixes later to maint).

 * Various code paths that initialize a cryptographic hash context but
   bail out or finish without calling 'git_hash_final()' have been taught
   to call 'git_hash_discard()' to release allocated resources, fixing
   memory leaks when Git is built with non-default backends like
   'OpenSSL' or 'libgcrypt'.
   (merge 600588d2aa jk/hash-algo-leak-fixes later to maint).

 * Various resource leaks, invalid file descriptor closures, and process
   handle ownership issues flagged by Coverity have been fixed.
   (merge 9184231173 js/coverity-fixes later to maint).

 * Dockerized CI jobs running in private GitHub repositories have been
   adjusted to use explicit process and file limits, preventing resource
   exhaustion errors on private runners.
   (merge bad766fbac js/ci-dockerized-pid-limit later to maint).

 * Various test scripts have been updated to clean up large temporary
   files and repositories, reducing peak disk usage during testing.
   Also, expensive tests have been disabled on platforms that lack
   sufficient resources (like 32-bit platforms and Windows CI runners),
   and the long test suite has been enabled in GitLab CI.
   (merge 84248444ad ps/t-fixes-for-git-test-long later to maint).

 * The UTF-8 precomposition wrapper on macOS has been updated to use a
   flexible array member to represent the name of a directory entry,
   preventing fortified libc checks from failing when the name is
   reallocated to be larger than 'NAME_MAX' bytes.
   (merge 1eb281159f ih/precompose-flex-array later to maint).

 * The 'git_hash_*()' wrappers have been updated to be used consistently
   across the codebase instead of direct calls to members of 'struct
   git_hash_algo', and 'git_hash_discard()' has been made idempotent to
   simplify cleanups.
   (merge 9e396aa553 jk/git-hash-cleanups later to maint).

 * The sideband demultiplexer has been updated to recognize ANSI SGR
   escape sequences that use colon-separated subfields (e.g., for
   256-color or true-color codes).
   (merge 3792b2aea4 mm/sideband-ansi-sgr-colon-fix later to maint).

 * The 'reftable' code has been hardened against corrupted tables by
   fixing out-of-bounds writes, out-of-bounds reads, and abort calls
   during parsing.
   (merge ca93c27328 ps/reftable-hardening later to maint).

 * A description in the release notes for Git 2.55.0 has been
   retroactively updated to clarify that Rust support is enabled by
   default, but still optional, and will become mandatory in Git 3.0.
   (merge 18b2009d14 jc/relnotes-2.55-rust-fix later to maint).

 * The early-exit optimization in 'paint_down_to_common()' has been
   gated on the queue being generation-ordered, fixing a bug where
   'git merge-base' (without '--all') could return incorrect results
   on repositories with v1 commit graphs and clock skew.
   (merge ae68032a8d kk/commit-reach-find-all-fix later to maint).

 * The client-side parser of the server-advertised bundle-URI list has
   been updated to drain the remaining response in order to avoid
   protocol desynchronization when the server sends a misconfigured list.
   Also, the server-side has been taught to omit empty configuration
   values instead of sending invalid key-value lines.
   (merge 50de1169e4 tc/bundle-uri-empty-fix later to maint).

 * The 'topo_levels' slab was propagated only to the topmost layer of a
   split commit-graph chain, causing topological levels for commits in
   base layers to be recomputed during incremental writes.  This has been
   corrected.

 * The stream-based object signature verification path has been
   corrected to avoid double-closing the stream on read errors.
   (merge cfd52a74a0 ps/odb-stream-double-close-fix later to maint).

 * The '-i' shorthand for the '--init' option, which was accepted by the
   'git submodule update' command until it was broken in a modernization
   of the option-parsing code, has been restored.
   (merge ff1da37f58 dm/submodule-update-i-shorthand later to maint).

 * An accidental use of the '%zu' format specifier in 'git
   submodule--helper' has been corrected to use 'PRIuMAX' and cast the
   value to 'uintmax_t' to avoid portability issues.
   (merge 3279c13c00 jc/submodule-helper-avoid-zu later to maint).

 * The rebase post-rewrite notes-copying logic has been corrected.  When
   a commit is dropped during rebase (e.g., because its changes are
   already upstream), it is no longer recorded as rewritten, preventing
   its notes from being copied to an unrelated commit.
   (merge 42554b78fd pw/rebase-drop-notes-with-commit later to maint).

 * A few memory problems in the Rust interface to C hash functions have
   been corrected.  The 'Clone' implementation of 'CryptoHasher' now
   properly initializes the context before cloning, and its 'Drop'
   implementation now discards the context to prevent leaks.
