[ANNOUNCE] Git v2.46.0-rc0

From: Junio C Hamano
Date: Fri Jul 12 2024 - 13:15:24 EST


An early preview release Git v2.46.0-rc0 is now available for
testing at the usual places. It is comprised of 602 non-merge
commits since v2.45.2, contributed by 66 people, 19 of which are
new faces [*].

The tarballs are found at:

https://www.kernel.org/pub/software/scm/git/testing/

The following public repositories all have a copy of the
'v2.46.0-rc0' tag and the 'master' branch that the tag points at:

url = https://git.kernel.org/pub/scm/git/git
url = https://kernel.googlesource.com/pub/scm/git/git
url = git://repo.or.cz/alt-git.git
url = https://github.com/gitster/git

New contributors whose contributions weren't in v2.45.2 are as follows.
Welcome to the Git development community!

Aaron Plattner, Abhijeet Sonar, Darcy Burke, David Bimmler, Dov
Murik, Dr. David Alan Gilbert, Fahad Alrashed, Heghedus Razvan,
Ivan Tse, James Liu, Jun T, Koji Nakamaru, Léonard Michelet,
lolligerhans@xxxxxx, Marcel Telka, Mathew George, Roland Hieber,
Shane Sun, and Tom Hughes.

Returning contributors who helped this release are as follows.
Thanks for your continued support.

Achu Luma, Adam Johnson, Beat Bolli, brian m. carlson, Chandra
Pratap, Christian Couder, Dario Gjorgjevski, D. Ben Knoble,
Derrick Stolee, Dragan Simic, Elijah Newren, Eric Sunshine,
Eric Wong, Ghanshyam Thakkar, Ian Wienand, Jeff King, Johannes
Schindelin, Johannes Sixt, John Passaro, John Paul Adrian
Glaubitz, Jonathan Nieder, Jonathan Tan, Josh Soref, Josh
Steadmon, Junio C Hamano, Justin Tobler, Kaartic Sivaraam,
Karthik Nayak, Kirill Smelkov, Kyle Lippincott, Kyle Zhao,
Linus Arver, Mike Hommey, Orgad Shaneh, Øystein Walle, Patrick
Steinhardt, Peter Krefting, Phillip Wood, Randall S. Becker,
René Scharfe, Rubén Justo, Stefan Haller, SZEDER Gábor,
Taylor Blau, Torsten Bögershausen, Victoria Dye, and Xing Xin.

[*] We are counting not just the authorship contribution but issue
reporting, mentoring, helping and reviewing that are recorded in
the commit trailers.

----------------------------------------------------------------

Git v2.46 Release Notes (draft)
===============================

Backward Compatibility Notes

(None at this moment)

UI, Workflows & Features

* The "--rfc" option of "git format-patch" learned to take an
optional string value to be used in place of "RFC" to tweak the
"[PATCH]" on the subject header.

* The credential helper protocol, together with the HTTP layer, have
been enhanced to support authentication schemes different from
username & password pair, like Bearer and NTLM.

* Command line completion script (in contrib/) learned to complete
"git symbolic-ref" a bit better (you need to enable plumbing
commands to be completed with GIT_COMPLETION_SHOW_ALL_COMMANDS).

* When the user responds to a prompt given by "git add -p" with an
unsupported command, list of available commands were given, which
was too much if the user knew what they wanted to type but merely
made a typo. Now the user gets a much shorter error message.

* The color parsing code learned to handle 12-bit RGB colors, spelled
as "#RGB" (in addition to "#RRGGBB" that is already supported).

* The operation mode options (like "--get") the "git config" command
uses have been deprecated and replaced with subcommands (like "git
config get").

* "git tag" learned the "--trailer" option to futz with the trailers
in the same way as "git commit" does.

* A new global "--no-advice" option can be used to disable all advice
messages, which is meant to be used only in scripts.

* Updates to symbolic refs can now be made as a part of ref
transaction.

* The trailer API has been reshuffled a bit.

* Terminology to call various ref-like things are getting
straightened out.

* The command line completion script (in contrib/) has been adjusted
to the recent update to "git config" that adopted subcommand based
UI.

* The knobs to tweak how reftable files are written have been made
available as configuration variables.

* When "git push" notices that the commit at the tip of the ref on
the other side it is about to overwrite does not exist locally, it
used to first try fetching it if the local repository is a partial
clone. The command has been taught not to do so and immediately
fail instead.

* The promisor.quiet configuration knob can be set to true to make
lazy fetching from promisor remotes silent.

* The inter/range-diff output has been moved to the end of the patch
when format-patch adds it to a single patch, instead of writing it
before the patch text, to be consistent with what is done for a
cover letter for a multi-patch series.

* A new command has been added to migrate a repository that uses the
files backend for its ref storage to use the reftable backend, with
limitations.

* "git diff --exit-code --ext-diff" learned to take the exit status
of the external diff driver into account when deciding the exit
status of the overall "git diff" invocation when configured to do
so.

* "git update-ref --stdin" learned to handle transactional updates of
symbolic-refs.

* "git format-patch --interdiff" for multi-patch series learned to
turn on cover letters automatically (unless told never to enable
cover letter with "--no-cover-letter" and such).

* The "--heads" option of "ls-remote" and "show-ref" has been been
deprecated; "--branches" replaces "--heads".

* For over a year, setting add.interactive.useBuiltin configuration
variable did nothing but giving a "this does not do anything"
warning. The warning has been removed.


Performance, Internal Implementation, Development Support etc.

* Advertise "git contacts", a tool for newcomers to find people to
ask review for their patches, a bit more in our developer
documentation.

* In addition to building the objects needed, try to link the objects
that are used in fuzzer tests, to make sure at least they build
without bitrot, in Linux CI runs.

* Code to write out reftable has seen some optimization and
simplification.

* Tests to ensure interoperability between reftable written by jgit
and our code have been added and enabled in CI.

* The singleton index_state instance "the_index" has been eliminated
by always instantiating "the_repository" and replacing references
to "the_index" with references to its .index member.

* Git-GUI has a new maintainer, Johannes Sixt.

* The "test-tool" has been taught to run testsuite tests in parallel,
bypassing the need to use the "prove" tool.

* The "whitespace check" task that was enabled for GitHub Actions CI
has been ported to GitLab CI.

* The refs API lost functions that implicitly assumes to work on the
primary ref_store by forcing the callers to pass a ref_store as an
argument.

* Code clean-up to reduce inter-function communication inside
builtin/config.c done via the use of global variables.

* The pack bitmap code saw some clean-up to prepare for a follow-up topic.

* Preliminary code clean-up for "git send-email".

* The default "creation-factor" used by "git format-patch" has been
raised to make it more aggressively find matching commits.

* Before discovering the repository details, We used to assume SHA-1
as the "default" hash function, which has been corrected. Hopefully
this will smoke out codepaths that rely on such an unwarranted
assumptions.

* The project decision making policy has been documented.

* The strcmp-offset tests have been rewritten using the unit test
framework.

* "git add -p" learned to complain when an answer with more than one
letter is given to a prompt that expects a single letter answer.

* The alias-expanded command lines are logged to the trace output.

* A new test was added to ensure git commands that are designed to
run outside repositories do work.

* Basic unit tests for reftable have been reimplemented under the
unit test framework.

* A pair of test helpers that essentially are unit tests on hash
algorithms have been rewritten using the unit-tests framework.

* A test helper that essentially is unit tests on the "decorate"
logic has been rewritten using the unit-tests framework.

* Many memory leaks in the sparse-checkout code paths have been
plugged.

* "make check-docs" noticed problems and reported to its output but
failed to signal its findings with its exit status, which has been
corrected.

* Building with "-Werror -Wwrite-strings" is now supported.

* To help developers, the build procedure now allows builders to use
CFLAGS_APPEND to specify additional CFLAGS.

* "oidtree" tests were rewritten to use the unit test framework.

* The structure of the document that records longer-term project
decisions to deprecate/remove/update various behaviour has been
outlined.

* The pseudo-merge reachability bitmap to help more efficient storage
of the reachability bitmap in a repository with too many refs has
been added.

* When "git merge" sees that the index cannot be refreshed (e.g. due
to another process doing the same in the background), it died but
after writing MERGE_HEAD etc. files, which was useless for the
purpose to recover from the failure.

* The output from "git cat-file --batch-check" and "--batch-command
(info)" should not be unbuffered, for which some tests have been
added.

* A CPP macro USE_THE_REPOSITORY_VARIABLE is introduced to help
transition the codebase to rely less on the availability of the
singleton the_repository instance.

* "git version --build-options" reports the version information of
OpenSSL and other libraries (if used) in the build.

* Memory ownership rules for the in-core representation of
remote.*.url configuration values have been straightened out, which
resulted in a few leak fixes and code clarification.

* When bundleURI interface fetches multiple bundles, Git failed to
take full advantage of all bundles and ended up slurping duplicated
objects, which has been corrected..

* The code to deal with modified paths that are out-of-cone in a
sparsely checked out working tree has been optimized.


Fixes since v2.45
-----------------

* "git rebase --signoff" used to forget that it needs to add a
sign-off to the resulting commit when told to continue after a
conflict stops its operation.

* The procedure to build multi-pack-index got confused by the
replace-refs mechanism, which has been corrected by disabling the
latter.

* The "-k" and "--rfc" options of "format-patch" will now error out
when used together, as one tells us not to add anything to the
title of the commit, and the other one tells us to add "RFC" in
addition to "PATCH".

* "git stash -S" did not handle binary files correctly, which has
been corrected.

* A scheduled "git maintenance" job is expected to work on all
repositories it knows about, but it stopped at the first one that
errored out. Now it keeps going.

* zsh can pretend to be a normal shell pretty well except for some
glitches that we tickle in some of our scripts. Work them around
so that "vimdiff" and our test suite works well enough with it.

* Command line completion support for zsh (in contrib/) has been
updated to stop exposing internal state to end-user shell
interaction.

* Tests that try to corrupt in-repository files in chunked format did
not work well on macOS due to its broken "mv", which has been
worked around.

* The maximum size of attribute files is enforced more consistently.

* Unbreak CI jobs so that we do not attempt to use Python 2 that has
been removed from the platform.

* Git 2.43 started using the tree of HEAD as the source of attributes
in a bare repository, which has severe performance implications.
For now, revert the change, without ripping out a more explicit
support for the attr.tree configuration variable.

* The "--exit-code" option of "git diff" command learned to work with
the "--ext-diff" option.

* Windows CI running in GitHub Actions started complaining about the
order of arguments given to calloc(); the imported regex code uses
the wrong order almost consistently, which has been corrected.

* Expose "name conflict" error when a ref creation fails due to D/F
conflict in the ref namespace, to improve an error message given by
"git fetch".
(merge 9339fca23e it/refs-name-conflict later to maint).

* The SubmittingPatches document now refers folks to manpages
translation project.

* The documentation for "git diff --name-only" has been clarified
that it is about showing the names in the post-image tree.

* The credential helper that talks with osx keychain learned to avoid
storing back the authentication material it just got received from
the keychain.
(merge e1ab45b2da kn/osxkeychain-skip-idempotent-store later to maint).

* The chainlint script (invoked during "make test") did nothing when
it failed to detect the number of available CPUs. It now falls
back to 1 CPU to avoid the problem.

* Revert overly aggressive "layered defence" that went into 2.45.1
and friends, which broke "git-lfs", "git-annex", and other use
cases, so that we can rebuild necessary counterparts in the open.

* "git init" in an already created directory, when the user
configuration has includeif.onbranch, started to fail recently,
which has been corrected.

* Memory leaks in "git mv" has been plugged.

* The safe.directory configuration knob has been updated to
optionally allow leading path matches.

* An overly large ".gitignore" files are now rejected silently.

* Upon expiration event, the credential subsystem forgot to clear
in-core authentication material other than password (whose support
was added recently), which has been corrected.

* Fix for an embarrassing typo that prevented Python2 tests from running
anywhere.

* Varargs functions that are unannotated as printf-like or execl-like
have been annotated as such.

* "git am" has a safety feature to prevent it from starting a new
session when there already is a session going. It reliably
triggers when a mbox is given on the command line, but it has to
rely on the tty-ness of the standard input. Add an explicit way to
opt out of this safety with a command line option.
(merge 62c71ace44 jk/am-retry later to maint).

* A leak in "git imap-send" that somehow escapes LSan has been
plugged.

* Setting core.abbrev too early before the repository set-up
(typically in "git clone") caused segfault, which as been
corrected.

* When the user adds to "git rebase -i" instruction to "pick" a merge
commit, the error experience is not pleasant. Such an error is now
caught earlier in the process that parses the todo list.

* We forgot to normalize the result of getcwd() to NFC on macOS where
all other paths are normalized, which has been corrected. This still
does not address the case where core.precomposeUnicode configuration
is not defined globally.

* Earlier we stopped using the tree of HEAD as the default source of
attributes in a bare repository, but failed to document it. This
has been corrected.

* "git update-server-info" and "git commit-graph --write" have been
updated to use the tempfile API to avoid leaving cruft after
failing.

* An unused extern declaration for mingw has been removed to prevent
it from causing build failure.

* A helper function shared between two tests had a copy-paste bug,
which has been corrected.

* "git fetch-pack -k -k" without passing "--lock-pack" (which we
never do ourselves) did not work at all, which has been corrected.

* CI job to build minimum fuzzers learned to pass NO_CURL=NoThanks to
the build procedure, as its build environment does not offer, or
the rest of the build needs, anything cURL.
(merge 4e66b5a990 jc/fuzz-sans-curl later to maint).

* "git diff --no-ext-diff" when diff.external is configured ignored
the "--color-moved" option.
(merge 0f4b0d4cf0 rs/diff-color-moved-w-no-ext-diff-fix later to maint).

* "git archive --add-virtual-file=<path>:<contents>" never paid
attention to the --prefix=<prefix> option but the documentation
said it would. The documentation has been corrected.
(merge 72c282098d jc/archive-prefix-with-add-virtual-file later to maint).

* When GIT_PAGER failed to spawn, depending on the code path taken,
we failed immediately (correct) or just spew the payload to the
standard output (incorrect). The code now always fail immediately
when GIT_PAGER fails.
(merge 78f0a5d187 rj/pager-die-upon-exec-failure later to maint).

* date parser updates to be more careful about underflowing epoch
based timestamp.
(merge 9d69789770 db/date-underflow-fix later to maint).

* The Bloom filter used for path limited history traversal was broken
on systems whose "char" is unsigned; update the implementation and
bump the format version to 2.
(merge 9c8a9ec787 tb/path-filter-fix later to maint).

* Typofix.
(merge 231cf7370e as/pathspec-h-typofix later to maint).

* Code clean-up.
(merge 4b837f821e rs/simplify-submodule-helper-super-prefix-invocation later to maint).

* Other code cleanup, docfix, build fix, etc.
(merge 493fdae046 ew/object-convert-leakfix later to maint).
(merge 00f3661a0a ss/doc-eol-attr-fix later to maint).

----------------------------------------------------------------

Changes since v2.45.2 are as follows:

Aaron Plattner (1):
credential: clear expired c->credential, unify secret clearing

Abhijeet Sonar (1):
pathspec: fix typo "glossary-context.txt" -> "glossary-content.txt"

Adam Johnson (1):
stash: fix "--staged" with binary files

Beat Bolli (3):
t/t4026-color: remove an extra double quote character
t/t4026-color: add test coverage for invalid RGB colors
color: add support for 12-bit RGB colors

Chandra Pratap (5):
t: move reftable/basics_test.c to the unit testing framework
t: move tests from reftable/stack_test.c to the new unit test
t: move tests from reftable/record_test.c to the new unit test
t: add test for put_be16()
t: improve the test-case for parse_names()

D. Ben Knoble (1):
completion: zsh: stop leaking local cache variable

Darcy Burke (1):
date: detect underflow/overflow when parsing dates with timezone offset

Derrick Stolee (7):
scalar: avoid segfault in reconfigure --all
commit-graph: increment progress indicator
sparse-checkout: refactor skip worktree retry logic
sparse-index: refactor path_found()
sparse-index: use strbuf in path_found()
sparse-index: count lstat() calls
sparse-index: improve lstat caching of sparse paths

Dov Murik (1):
documentation: git-update-index: add --show-index-version to synopsis

Dr. David Alan Gilbert (1):
fetch-pack: remove unused 'struct loose_object_iter'

Dragan Simic (3):
send-email: move newline characters out of a few translatable strings
format-patch: ensure that --rfc and -k are mutually exclusive
doc: interactive.singleKey is disabled by default

Eric Sunshine (2):
chainlint.pl: make CPU count computation more robust
chainlint.pl: latch CPU count directly reported by /proc/cpuinfo

Eric Wong (3):
Git.pm: use array in command_bidi_pipe example
t1006: ensure cat-file info isn't buffered by default
object-file: fix leak on conversion failure

Fahad Alrashed (1):
git-p4: show Perforce error to the user

Ghanshyam Thakkar (5):
t/: port helper/test-strcmp-offset.c to unit-tests/t-strcmp-offset.c
t/: migrate helper/test-example-decorate to the unit testing framework
strbuf: introduce strbuf_addstrings() to repeatedly add a string
t/: migrate helper/test-{sha1, sha256} to unit-tests/t-hash
t/: migrate helper/test-oidtree.c to unit-tests/t-oidtree.c

Ian Wienand (3):
Documentation: alias: rework notes into points
Documentation: alias: add notes on shell expansion
run-command: show prepared command

Ivan Tse (1):
refs: return conflict error when checking packed refs

James Liu (3):
doc: clean up usage documentation for --no-* opts
doc: add spacing around paginate options
advice: add --no-advice global option

Jeff King (41):
t/Makefile: run unit tests alongside shell tests
ci: update coverity runs_on_pool reference
ci: drop mention of BREW_INSTALL_PACKAGES variable
ci: avoid bare "gcc" for osx-gcc job
ci: stop installing "gcc-13" for osx-gcc
t-strvec: use va_end() to match va_start()
t-strvec: mark variable-arg helper with LAST_ARG_MUST_BE_NULL
mv: move src_dir cleanup to end of cmd_mv()
mv: factor out empty src_dir removal
mv: replace src_dir with a strvec
dir.c: skip .gitignore, etc larger than INT_MAX
sparse-checkout: free string list in write_cone_to_file()
sparse-checkout: pass string literals directly to add_pattern()
dir.c: free strings in sparse cone pattern hashmaps
sparse-checkout: clear patterns when init() sees existing sparse file
dir.c: free removed sparse-pattern hashmap entries
dir.c: reduce max pattern file size to 100MB
dir.c: always copy input to add_pattern()
sparse-checkout: reuse --stdin buffer when reading patterns
sparse-checkout: always free "line" strbuf after reading input
sparse-checkout: refactor temporary sparse_checkout_patterns
sparse-checkout: free sparse_filename after use
sparse-checkout: free pattern list in sparse_checkout_list()
sparse-checkout: free string list after displaying
sparse-checkout: free duplicate hashmap entries
am: add explicit "--retry" option
test-terminal: drop stdin handling
imap-send: free all_msgs strbuf in "out" label
archive: fix check for missing url
remote: refactor alias_url() memory ownership
remote: transfer ownership of memory in add_url(), etc
remote: use strvecs to store remote url/pushurl
remote: simplify url/pushurl selection
config: document remote.*.url/pushurl interaction
remote: allow resetting url list
t5801: make remote-testgit GIT_DIR setup more robust
t5801: test remote.*.vcs config
remote: always require at least one url in a remote
remote: drop checks for zero-url case
fetch-pack: fix segfault when fscking without --lock-pack
t5500: fix mistaken $SERVER reference in helper function

Johannes Schindelin (4):
for-each-repo: optionally keep going on an error
maintenance: running maintenance should not stop on errors
cmake: let `test-tool` run the unit tests, too
mingw: drop bogus (and unneeded) declaration of `_pgmptr`

Johannes Sixt (1):
git-gui: note the new maintainer

John Passaro (3):
builtin/commit: use ARGV macro to collect trailers
builtin/commit: refactor --trailer logic
builtin/tag: add --trailer option

John Paul Adrian Glaubitz (1):
chainlint.pl: fix incorrect CPU count on Linux SPARC

Jonathan Tan (1):
gitformat-commit-graph: describe version 2 of BDAT

Josh Soref (2):
doc: update links to current pages
doc: switch links to https

Josh Steadmon (8):
fuzz: link fuzz programs with `make all` on Linux
t0080: turn t-basic unit test into a helper
test-tool run-command testsuite: get shell from env
test-tool run-command testsuite: remove hardcoded filter
test-tool run-command testsuite: support unit tests
unit tests: add rule for running with test-tool
ci: use test-tool as unit test runner on Windows
doc: describe the project's decision-making process

Junio C Hamano (61):
format-patch: allow --rfc to optionally take a value, like --rfc=WIP
format-patch: "--rfc=-(WIP)" appends to produce [PATCH (WIP)]
Start the 2.46 cycle
rev-parse: document how --is-* options work outside a repository
t/lib-chunk: work around broken "mv" on some vintage of macOS
stop using HEAD for attributes in bare repository by default
Makefile(s): do not enforce "all indents must be done with tab"
format-patch: run range-diff with larger creation-factor
t0018: two small fixes
The second batch
SubmittingPatches: move the patch-flow section earlier
SubmittingPatches: extend the "flow" section
SubmittingPatches: welcome the new maintainer of git-gui part
compat/regex: fix argument order to calloc(3)
The third batch
The fourth batch
Revert "diff: fix --exit-code with external diff"
The fifth batch
t0017: clarify dubious test set-up
SubmittingPatches: advertise git-manpages-l10n project a bit
diff: document what --name-only shows
The sixth batch
setup: add an escape hatch for "no more default hash algorithm" change
t1517: test commands that are designed to be run outside repository
apply: fix uninitialized hash function
add-patch: enforce only one-letter response to prompts
The seventh batch
show_log: factor out interdiff/range-diff generation
format-patch: move range/inter diff at the end of a single patch output
The eighth batch
safe.directory: allow "lead/ing/path/*" match
The ninth batch
t1517: more coverage for commands that work without repository
Post 2.45.2 updates
The tenth batch
imap-send: minimum leakfix
refs: call branches branches
ls-remote: introduce --branches and deprecate --heads
show-ref: introduce --branches and deprecate --heads
attr.tree: HEAD:.gitattributes is no longer the default in a bare repo
add-i: finally retire add.interactive.useBuiltin
The eleventh batch
worktree_git_path(): move the declaration to path.h
__attribute__: trace2_region_enter_printf() is like "printf"
__attribute__: remove redundant attribute declaration for git_die_config()
__attribute__: mark some functions with LAST_ARG_MUST_BE_NULL
__attribute__: add a few missing format attributes
The twelfth batch
The thirteenth batch
The fourteenth batch
The fifteenth batch
fuzz: minimum fuzzers environment lacks libcURL
The sixteenth batch
t0006: simplify prerequisites
archive: document that --add-virtual-file takes full path
The seventeenth batch
More post 2.45.2 updates from the 'master' front
Yet another batch of post 2.45.2 updates from the 'master' front
The eighteenth batch
The ninteenth batch
Git 2.46-rc0

Justin Tobler (6):
doc: clarify practices for submitting updated patch versions
ci: pre-collapse GitLab CI sections
github-ci: fix link to whitespace error
ci: separate whitespace check script
ci: make the whitespace report optional
gitlab-ci: add whitespace error check

Karthik Nayak (16):
refs: accept symref values in `ref_transaction_update()`
files-backend: extract out `create_symref_lock()`
refs: support symrefs in 'reference-transaction' hook
refs: move `original_update_refname` to 'refs.c'
refs: add support for transactional symref updates
refs: use transaction in `refs_create_symref()`
refs: rename `refs_create_symref()` to `refs_update_symref()`
refs: remove `create_symref` and associated dead code
SubmittingPatches: add section for iterating patches
refs: create and use `ref_update_expects_existing_old_ref()`
refs: specify error for regular refs with `old_target`
update-ref: add support for 'symref-verify' command
update-ref: add support for 'symref-delete' command
update-ref: add support for 'symref-create' command
reftable: pick either 'oid' or 'target' for new updates
update-ref: add support for 'symref-update' command

Koji Nakamaru (2):
osxkeychain: exclusive lock to serialize execution of operations
osxkeychain: state to skip unnecessary store operations

Kyle Lippincott (1):
attr: fix msan issue in read_attr_from_index

Kyle Zhao (1):
merge: avoid write merge state when unable to write index

Linus Arver (18):
MyFirstContribution: mention contrib/contacts/git-contacts
SubmittingPatches: clarify 'git-contacts' location
SubmittingPatches: mention GitGitGadget
SubmittingPatches: quote commands
SubmittingPatches: discuss reviewers first
SubmittingPatches: dedupe discussion of security patches
SubmittingPatches: add heading for format-patch and send-email
SubmittingPatches: demonstrate using git-contacts with git-send-email
Makefile: sort UNIT_TEST_PROGRAMS
trailer: add unit tests for trailer iterator
trailer: teach iterator about non-trailer lines
sequencer: use the trailer iterator
interpret-trailers: access trailer_info with new helpers
trailer: make parse_trailers() return trailer_info pointer
trailer: make trailer_info struct private
trailer: retire trailer_info_get() from API
trailer: document parse_trailers() usage
trailer unit tests: inspect iterator contents

Marcel Telka (9):
t/t0211-trace2-perf.sh: fix typo patern -> pattern
Switch grep from non-portable BRE to portable ERE
t/t9902-completion.sh: backslashes in echo
t/t0600-reffiles-backend.sh: rm -v is not portable
t/t4202-log.sh: fix misspelled variable
t/t1700-split-index.sh: mv -v is not portable
t/t9118-git-svn-funky-branch-names.sh: sed needs semicolon
t/t9001-send-email.sh: sed - remove the i flag for s
scalar: make enlistment delete to work on all POSIX platforms

Mike Hommey (1):
win32: fix building with NO_UNIX_SOCKETS

Orgad Shaneh (1):
git-gui: fix inability to quit after closing another instance

Patrick Steinhardt (262):
refs/reftable: fix D/F conflict error message on ref copy
refs/reftable: perform explicit D/F check when writing symrefs
refs/reftable: skip duplicate name checks
reftable: remove name checks
refs/reftable: don't recompute committer ident
reftable/writer: refactorings for `writer_add_record()`
reftable/writer: refactorings for `writer_flush_nonempty_block()`
reftable/writer: unify releasing memory
reftable/writer: reset `last_key` instead of releasing it
reftable/block: reuse zstream when writing log blocks
reftable/block: reuse compressed array
ci: rename "runs_on_pool" to "distro"
ci: expose distro name in dockerized GitHub jobs
ci: skip sudo when we are already root
ci: drop duplicate package installation for "linux-gcc-default"
ci: convert "install-dependencies.sh" to use "/bin/sh"
ci: merge custom PATH directories
ci: fix setup of custom path for GitLab CI
ci: merge scripts which install dependencies
ci: make Perforce binaries executable for all users
ci: install JGit dependency
t06xx: always execute backend-specific tests
t0610: fix non-portable variable assignment
t0612: add tests to exercise Git/JGit reftable compatibility
t/helper: stop using `the_index`
builtin: stop using `the_index`
repository: initialize index in `repo_init()`
builtin/clone: stop using `the_index`
repository: drop `the_index` variable
repository: drop `initialize_the_repository()`
config: clarify memory ownership when preparing comment strings
builtin/config: move option array around
builtin/config: move "fixed-value" option to correct group
builtin/config: use `OPT_CMDMODE()` to specify modes
builtin/config: pull out function to handle config location
builtin/config: pull out function to handle `--null`
builtin/config: introduce "list" subcommand
builtin/config: introduce "get" subcommand
builtin/config: introduce "set" subcommand
builtin/config: introduce "unset" subcommand
builtin/config: introduce "rename-section" subcommand
builtin/config: introduce "remove-section" subcommand
builtin/config: introduce "edit" subcommand
builtin/config: display subcommand help
gitlab-ci: add smoke test for fuzzers
ci: fix Python dependency on Ubuntu 24.04
path: harden validation of HEAD with non-standard hashes
path: move `validate_headref()` to its only user
parse-options-cb: only abbreviate hashes when hash algo is known
attr: don't recompute default attribute source
attr: fix BUG() when parsing attrs outside of repo
remote-curl: fix parsing of detached SHA256 heads
builtin/rev-parse: allow shortening to more than 40 hex characters
builtin/blame: don't access potentially unitialized `the_hash_algo`
builtin/bundle: abort "verify" early when there is no repository
builtin/diff: explicitly set hash algo when there is no repo
builtin/shortlog: don't set up revisions without repo
oss-fuzz/commit-graph: set up hash algorithm
repository: stop setting SHA1 as the default object hash
refs: introduce missing functions that accept a `struct ref_store`
refs: add `exclude_patterns` parameter to `for_each_fullref_in()`
cocci: introduce rules to transform "refs" to pass ref store
cocci: apply rules to rewrite callers of "refs" interfaces
refs: remove functions without ref store
gitlab-ci: fix installing dependencies for fuzz smoke tests
reftable: consistently refer to `reftable_write_options` as `opts`
reftable: pass opts as constant pointer
reftable/writer: drop static variable used to initialize strbuf
reftable/writer: improve error when passed an invalid block size
reftable/dump: support dumping a table's block structure
refs/reftable: allow configuring block size
reftable: use `uint16_t` to track restart interval
refs/reftable: allow configuring restart interval
refs/reftable: allow disabling writing the object index
reftable: make the compaction factor configurable
refs/reftable: allow configuring geometric factor
reftable/block: use `size_t` to track restart point index
reftable/reader: avoid copying index iterator
reftable/reader: unify indexed and linear seeking
reftable/reader: separate concerns of table iter and reftable reader
reftable/reader: inline `reader_seek_internal()`
reftable/reader: set up the reader when initializing table iterator
reftable/merged: split up initialization and seeking of records
reftable/merged: simplify indices for subiterators
reftable/generic: move seeking of records into the iterator
reftable/generic: adapt interface to allow reuse of iterators
reftable/reader: adapt interface to allow reuse of iterators
reftable/stack: provide convenience functions to create iterators
reftable/merged: adapt interface to allow reuse of iterators
builtin/config: stop printing full usage on misuse
builtin/config: move legacy mode into its own function
builtin/config: move subcommand options into `cmd_config()`
builtin/config: move legacy options into `cmd_config()`
builtin/config: move actions into `cmd_config_actions()`
builtin/config: check for writeability after source is set up
config: make the config source const
builtin/config: refactor functions to have common exit paths
builtin/config: move location options into local variables
builtin/config: move display options into local variables
builtin/config: move type options into display options
builtin/config: move default value into display options
builtin/config: move `respect_includes_opt` into location options
builtin/config: convert `do_not_match` to a local variable
builtin/config: convert `value_pattern` to a local variable
builtin/config: convert `regexp` to a local variable
builtin/config: convert `key_regexp` to a local variable
builtin/config: convert `key` to a local variable
builtin/config: track "fixed value" option via flags only
builtin/config: convert flags to a local variable
builtin/config: pass data between callbacks via local variables
Documentation/glossary: redefine pseudorefs as special refs
Documentation/glossary: clarify limitations of pseudorefs
Documentation/glossary: define root refs as refs
refs: rename `is_pseudoref()` to `is_root_ref()`
refs: rename `is_special_ref()` to `is_pseudo_ref()`
refs: do not check ref existence in `is_root_ref()`
refs: classify HEAD as a root ref
refs: pseudorefs are no refs
ref-filter: properly distinuish pseudo and root refs
refs: refuse to write pseudorefs
completion: adapt git-config(1) to complete subcommands
refs: adjust names for `init` and `init_db` callbacks
refs: rename `init_db` callback to avoid confusion
refs: implement releasing ref storages
refs: track ref stores via strmap
refs: pass repo when retrieving submodule ref store
refs: refactor `resolve_gitlink_ref()` to accept a repository
refs: retrieve worktree ref stores via associated repository
refs: convert iteration over replace refs to accept ref store
refs: pass ref store when detecting dangling symrefs
refs: move object peeling into "object.c"
refs: pass repo when peeling objects
refs: drop `git_default_branch_name()`
refs: remove `dwim_log()`
refs/files: use correct repository
refs/files: remove references to `the_hash_algo`
refs/packed: remove references to `the_hash_algo`
builtin/patch-id: fix uninitialized hash function
builtin/hash-object: fix uninitialized hash function
setup: fix bug with "includeIf.onbranch" when initializing dir
ci: add missing dependency for TTY prereq
transport-helper: fix leaking helper name
t: mark a bunch of tests as leak-free
strbuf: fix leak when `appendwholeline()` fails with EOF
checkout: clarify memory ownership in `unique_tracking_name()`
http: refactor code to clarify memory ownership
config: clarify memory ownership in `git_config_pathname()`
diff: refactor code to clarify memory ownership of prefixes
convert: refactor code to clarify ownership of check_roundtrip_encoding
builtin/log: stop using globals for log config
builtin/log: stop using globals for format config
config: clarify memory ownership in `git_config_string()`
config: plug various memory leaks
builtin/credential: clear credential before exit
commit-reach: fix memory leak in `ahead_behind()`
submodule: fix leaking memory for submodule entries
strvec: add functions to replace and remove strings
builtin/mv: refactor `add_slash()` to always return allocated strings
builtin/mv duplicate string list memory
builtin/mv: refactor to use `struct strvec`
builtin/mv: fix leaks for submodule gitfile paths
Makefile: extract script to lint missing/extraneous manpages
Documentation/lint-manpages: bubble up errors
gitlab-ci: add job to run `make check-docs`
ci/test-documentation: work around SyntaxWarning in Python 3.12
setup: unset ref storage when reinitializing repository version
refs: convert ref storage format to an enum
refs: pass storage format to `ref_store_init()` explicitly
refs: allow to skip creation of reflog entries
refs/files: refactor `add_pseudoref_and_head_entries()`
refs/files: extract function to iterate through root refs
refs/files: fix NULL pointer deref when releasing ref store
reftable: inline `merged_table_release()`
worktree: don't store main worktree twice
refs: implement removal of ref storages
refs: implement logic to migrate between ref storage formats
builtin/refs: new command to migrate ref storage formats
ci: fix check for Ubuntu 20.04
global: improve const correctness when assigning string constants
global: convert intentionally-leaking config strings to consts
refs/reftable: stop micro-optimizing refname allocations on copy
reftable: cast away constness when assigning constants to records
refspec: remove global tag refspec structure
builtin/remote: cast away constness in `get_head_names()`
diff: cast string constant in `fill_textconv()`
line-log: stop assigning string constant to file parent buffer
line-log: always allocate the output prefix
entry: refactor how we remove items for delayed checkouts
ident: add casts for fallback name and GECOS
object-file: mark cached object buffers as const
object-file: make `buf` parameter of `index_mem()` a constant
pretty: add casts for decoration option pointers
compat/win32: fix const-correctness with string constants
http: do not assign string constant to non-const field
parse-options: cast long name for OPTION_ALIAS
send-pack: always allocate receive status
remote-curl: avoid assigning string constant to non-const variable
revision: always store allocated strings in output encoding
mailmap: always store allocated strings in mailmap blob
imap-send: drop global `imap_server_conf` variable
imap-send: fix leaking memory in `imap_server_conf`
builtin/rebase: do not assign default backend to non-constant field
builtin/rebase: always store allocated string in `options.strategy`
builtin/merge: always store allocated strings in `pull_twohead`
config.mak.dev: enable `-Wwrite-strings` warning
revision: fix memory leak when reversing revisions
parse-options: fix leaks for users of OPT_FILENAME
notes-utils: free note trees when releasing copied notes
bundle: plug leaks in `create_bundle()`
biultin/rev-parse: fix memory leaks in `--parseopt` mode
merge-recursive: fix leaking rename conflict info
revision: fix leaking display notes
notes: fix memory leak when pruning notes
builtin/rev-list: fix leaking bitmap index when calculating disk usage
object-name: free leaking object contexts
builtin/difftool: plug memory leaks in `run_dir_diff()`
builtin/merge-recursive: fix leaking object ID bases
merge-recursive: fix memory leak when finalizing merge
builtin/log: fix leaking commit list in git-cherry(1)
revision: free diff options
builtin/stash: fix leak in `show_stash()`
rerere: fix various trivial leaks
config: fix leaking "core.notesref" variable
commit: fix leaking parents when calling `commit_tree_extended()`
sequencer: fix leaking string buffer in `commit_staged_changes()`
apply: fix leaking string in `match_fragment()`
builtin/clone: plug leaking HEAD ref in `wanted_peer_refs()`
sequencer: fix memory leaks in `make_script_with_merges()`
builtin/merge: fix leaking `struct cmdnames` in `get_strategy()`
merge: fix leaking merge bases
line-range: plug leaking find functions
blame: fix leaking data for blame scoreboards
builtin/blame: fix leaking prefixed paths
builtin/blame: fix leaking ignore revs files
Makefile: add ability to append to CFLAGS and LDFLAGS
config: fix segfault when parsing "core.abbrev" without repo
parse-options-cb: stop clamping "--abbrev=" to hash length
object-name: don't try to abbreviate to lengths greater than hexsz
docs: introduce document to announce breaking changes
BreakingChanges: document upcoming change from "sha1" to "sha256"
BreakingChanges: document removal of grafting
BreakingChanges: document that we do not plan to deprecate git-checkout
hash: drop (mostly) unused `is_empty_{blob,tree}_sha1()` functions
hash: require hash algorithm in `hasheq()`, `hashcmp()` and `hashclr()`
hash: require hash algorithm in `oidread()` and `oidclr()`
global: ensure that object IDs are always padded
hash: convert `oidcmp()` and `oideq()` to compare whole hash
hash: make `is_null_oid()` independent of `the_repository`
hash: require hash algorithm in `is_empty_{blob,tree}_oid()`
hash: require hash algorithm in `empty_tree_oid_hex()`
global: introduce `USE_THE_REPOSITORY_VARIABLE` macro
refs: avoid include cycle with "repository.h"
hash-ll: merge with "hash.h"
http-fetch: don't crash when parsing packfile without a repo
oidset: pass hash algorithm when parsing file
protocol-caps: use hash algorithm from passed-in repository
replace-object: use hash algorithm from passed-in repository
compat/fsmonitor: fix socket path in networked SHA256 repos
t/helper: use correct object hash in partial-clone helper
t/helper: fix segfault in "oid-array" command without repository
t/helper: remove dependency on `the_repository` in "proc-receive"
hex: guard declarations with `USE_THE_REPOSITORY_VARIABLE`

Peter Krefting (1):
git-gui: sv.po: Update Swedish translation (576t0f0u)

Phillip Wood (7):
sequencer: always free "struct replay_opts"
sequencer: start removing private fields from public API
sequencer: move current fixups to private context
sequencer: store commit message in private context
rebase -m: fix --signoff with conflicts
rebase -i: pass struct replay_opts to parse_insn_line()
rebase -i: improve error message when picking merge

Randall S. Becker (3):
version: --build-options reports OpenSSL version information
version: teach --build-options to reports libcurl version information
version: teach --build-options to reports zlib version information

René Scharfe (10):
diff-lib: stop calling diff_setup_done() in do_diff_cache()
diff: report unmerged paths as changes in run_diff_cmd()
diff: fix --exit-code with external diff
difftool: add env vars directly in run_file_diff()
t4020: test exit code with external diffs
userdiff: add and use struct external_diff
diff: let external diffs report that changes are uninteresting
commit: remove find_header_mem()
diff: allow --color-moved with --no-ext-diff
submodule--helper: use strvec_pushf() for --super-prefix

Roland Hieber (3):
completion: add 'symbolic-ref'
completion: improve docs for using __git_complete
completion: add docs on how to add subcommand completions

Rubén Justo (5):
add-patch: do not show UI messages on stderr
add-patch: response to unknown command
t4014: cleanups in a few tests
format-patch: assume --cover-letter for diff in multi-patch series
pager: die when paging to non-existing command

Shane Sun (1):
doc: fix case error of eol attribute in example

Taylor Blau (62):
attr.c: move ATTR_MAX_FILE_SIZE check into read_attr_from_buf()
Makefile(s): avoid recipe prefix in conditional statements
object.h: add flags allocated by pack-bitmap.h
pack-bitmap-write.c: move commit_positions into commit_pos fields
pack-bitmap: avoid use of static `bitmap_writer`
pack-bitmap: drop unused `max_bitmaps` parameter
pack-bitmap-write.c: avoid uninitialized 'write_as' field
pack-bitmap: introduce `bitmap_writer_free()`
Documentation/gitpacking.txt: initial commit
Documentation/gitpacking.txt: describe pseudo-merge bitmaps
Documentation/technical: describe pseudo-merge bitmaps format
ewah: implement `ewah_bitmap_is_subset()`
pack-bitmap: move some initialization to `bitmap_writer_init()`
pseudo-merge.ch: initial commit
pack-bitmap-write: support storing pseudo-merge commits
pack-bitmap: implement `bitmap_writer_has_bitmapped_object_id()`
pack-bitmap: make `bitmap_writer_push_bitmapped_commit()` public
config: introduce `git_config_double()`
pseudo-merge: implement support for selecting pseudo-merge commits
pack-bitmap-write.c: write pseudo-merge table
pack-bitmap: extract `read_bitmap()` function
pseudo-merge: scaffolding for reads
pack-bitmap.c: read pseudo-merge extension
pseudo-merge: implement support for reading pseudo-merge commits
ewah: implement `ewah_bitmap_popcount()`
pack-bitmap: implement test helpers for pseudo-merge
t/test-lib-functions.sh: support `--notick` in `test_commit_bulk()`
pack-bitmap.c: use pseudo-merges during traversal
pack-bitmap: extra trace2 information
ewah: `bitmap_equals_ewah()`
pseudo-merge: implement support for finding existing merges
t/perf: implement performance tests for pseudo-merge bitmaps
midx-write.c: tolerate `--preferred-pack` without bitmaps
midx-write.c: reduce argument count for `get_sorted_entries()`
midx-write.c: pass `start_pack` to `compute_sorted_entries()`
midx-write.c: extract `should_include_pack()`
midx-write.c: extract `fill_packs_from_midx()`
midx-write.c: support reading an existing MIDX with `packs_to_include`
midx: replace `get_midx_rev_filename()` with a generic helper
pack-bitmap.c: reimplement `midx_bitmap_filename()` with helper
commit-graph.c: remove temporary graph layers on exit
server-info.c: remove temporary info files on exit
midx-write.c: do not read existing MIDX with `packs_to_include`
pack-bitmap.c: avoid uninitialized `pack_int_id` during reuse
pack-revindex.c: guard against out-of-bounds pack lookups
Documentation/technical/bitmap-format.txt: add missing position table
pack-bitmap.c: ensure pseudo-merge offset reads are bounded
t/t4216-log-bloom.sh: harden `test_bloom_filters_not_used()`
revision.c: consult Bloom filters for root commits
commit-graph: ensure Bloom filters are read with consistent settings
t/helper/test-read-graph.c: extract `dump_graph_info()`
bloom.h: make `load_bloom_filter_from_graph()` public
t/helper/test-read-graph: implement `bloom-filters` mode
t4216: test changed path filters with high bit paths
repo-settings: introduce commitgraph.changedPathsVersion
bloom: annotate filters with hash version
bloom: prepare to discard incompatible Bloom filters
commit-graph: unconditionally load Bloom filters
commit-graph: new Bloom filter version that fixes murmur3
object.h: fix mis-aligned flag bits table
commit-graph: reuse existing Bloom filters where possible
bloom: introduce `deinit_bloom_filters()`

Tom Hughes (2):
push: don't fetch commit object when checking existence
promisor-remote: add promisor.quiet configuration option

Torsten Bögershausen (1):
macOS: ls-files path fails if path of workdir is NFD

Victoria Dye (1):
Documentation/git-merge-tree.txt: document -X

Xing Xin (4):
midx: disable replace objects
bundle-uri: verify oid before writing refs
fetch-pack: expose fsckObjects configuration logic
unbundle: extend object verification for fetches

brian m. carlson (19):
credential: add an authtype field
remote-curl: reset headers on new request
http: use new headers for each object request
credential: add a field for pre-encoded credentials
credential: gate new fields on capability
credential: add a field called "ephemeral"
docs: indicate new credential protocol fields
http: add support for authtype and credential
credential: add an argument to keep state
credential: enable state capability
docs: set a limit on credential line length
t5563: refactor for multi-stage authentication
credential: add support for multistage credential rounds
t: add credential tests for authtype
credential-cache: implement authtype capability
credential: add method for querying capabilities
t4046: avoid continue in &&-chain for zsh
vimdiff: make script and tests work with zsh
git-gui: po: fix typo in French "aperçu"

Øystein Walle (1):
Documentation: Mention that refspecs are explained elsewhere