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.

 * Userdiff patterns for Swift have been added, with support for
   Swift-specific constructs such as attributes, modifiers, failable
   initializers, and generics.

 * Configuration file locking has been updated to retry for a short
   period, avoiding failures when multiple processes attempt to update
   the configuration simultaneously.

 * The 'remote-object-info' command has been added to 'git cat-file
   --batch-command', allowing clients to request object metadata
   (currently size) from a remote server via protocol v2 without
   downloading the entire object.  Format placeholders are dynamically
   filtered on the client based on server-advertised capabilities,
   returning empty strings for inapplicable or unsupported fields.


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'.

 * The tempfile and lockfile APIs have been refactored to stop depending
   on the 'the_repository' global variable, and their callers have been
   updated to use the repository-aware variants.

 * The 'trust_executable_bit' (coming from the 'core.filemode'
   configuration) has been migrated into 'struct repo_config_values' to
   tie it to a specific repository instance.

 * The 'excludes_file' and various other global configuration variables
   (including 'editor_program', 'pager_program', 'askpass_program', and
   'push_default') have been migrated into the per-repository structure.

 * The 'git stash push' command has been optimized to avoid unnecessary
   sparse index expansion when pathspecs are wholly inside the
   sparse-checkout cone.  Also, a potential out-of-bounds read in the
   sparse-index expansion check helper pathspec_needs_expanded_index()
   has been fixed by consistently using the parsed, prefixed path.

 * The logic to write loose objects has been refactored and moved from
   'object-file.c' to the loose backend source file 'odb/source-loose.c',
   making the loose backend more self-contained.  This is achieved by
   first refactoring force_object_loose() to use generic ODB write
   interfaces instead of loose-backend internals.


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.

 * The object ID shortening and linking in the 'commitdiff' view of
   'gitweb' has been corrected to work even when the index line carries
   a trailing file mode.
   (merge fda513d6fe tl/gitweb-shorten-hashes-with-modes later to maint).
