[ANNOUNCE] Git v2.52.0-rc1
- From
Junio C Hamano <gitster@pobox.com>
- Date
- Nov 6, 2025, 17:16 UTC
- Message-ID
- <xmqqqzubhyj9.fsf@gitster.g>
A release candidate Git v2.52.0-rc1 is now available for testing at the usual places. It is comprised of 606 non-merge commits since v2.51.0, contributed by 80 people, 33 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.52.0-rc1' 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.51.0 are as follows. Welcome to the Git development community!
Alexander Monakov, Cheng, Colin Stagner, Daniele Sassoli, Emily Yang, Evgeni Chasnovski, Evgeny Cherpak, Ezekiel Newren, Gregoire Geis, Igor Stepushchik, Isaac Oscar Gariano, Jake Zimmerman, Joe Drew, Julia Evans, KIYOTA Fumiya, Knut Harald Ryager, Kyle E. Mitchell, Langbart, Lauri Tirkkonen, Mikhail Malinouski, NeilBrown, Olamide Caleb Bello, Paulo Casaretto, Queen Ediri Jessa, Rick Sanders, Ruoyu Zhong, Simon Cheng, Solly, Thomas Uhle, Windl, Ulrich, Xinyu Ruan, Xi Ruoyao, and ノウラ | Flare.
Returning contributors who helped this release are as follows. Thanks for your continued support.
Adam Dinwoodie, Aditya Garg, Ayush Chandekar, brian m. carlson, Christian Couder, Collin Funk, David Aguilar, D. Ben Knoble, Denton Liu, Derrick Stolee, Elijah Newren, Eric Sunshine, Eric W. Biederman, Ghanshyam Thakkar, Greg Hurrell, Han Jiang, Heiko Voigt, Jacob Keller, Jean-Noël Avila, Jeff King, Johannes Schindelin, Johannes Sixt, Jonathan Tan, Junio C Hamano, Justin Tobler, Karthik Nayak, Kristoffer Haugsbakk, Lidong Yan, Lucas Seiki Oshiro, Mark Levedahl, Meet Soni, M Hickford, Michael Lohmann, Michael Rappazzo, Patrick Steinhardt, Phillip Wood, Ramsay Jones, Randall S. Becker, René Scharfe, shejialuo, SZEDER Gábor, Taylor Blau, Todd Zullinger, Toon Claes, Torsten Bögershausen, Usman Akinyemi, and Дилян Палаузов.
[*] We are counting not just the authorship contribution but issue
reporting, mentoring, helping and reviewing that are recorded in
the commit trailers.----------------------------------------------------------------
Git v2.52 Release Notes (draft) ===============================
UI, Workflows & Features ------------------------
* The "list" subcommand of "git refs" acts as a front-end for "git for-each-ref".
* "git cmd --help-all" now works outside repositories.
* "git diff-tree" learned "--max-depth" option.
* A new subcommand "git repo" gives users a way to grab various repository characteristics.
* A new command "git last-modified" has been added to show the closest ancestor commit that touched each path.
* "git refs exists" that works like "git show-ref --exists" has been added.
* "repo info" learns a short-hand option "-z" that is the same as "--format=nul", and learns to report the objects format used in the repository.
* "core.commentChar=auto" that attempts to dynamically pick a suitable comment character is non-workable, as it is too much trouble to support for little benefit, and is marked as deprecated.
* "git send-email" learned to drive "git imap-send" to store already sent e-mails in an IMAP folder.
* The "promisor-remote" capability mechanism has been updated to allow the "partialCloneFilter" settings and the "token" value to be communicated from the server side.
* Declare that "git init" that is not otherwise configured uses 'main' as the initial branch, not 'master', starting Git 3.0.
* Keep giving hint about the default initial branch name for users who may be surprised after Git 3.0 switch-over.
* The stash.index configuration variable can be set to make "git stash pop/apply" pretend that it was invoked with "--index".
* "git fast-import" learned that "--signed-commits=<how>" option that corresponds to that of "git fast-export".
* Marking a hunk 'selected' in "git add -p" and then splitting made all the split pieces 'selected'; this has been changed to make them all 'undecided', which gives better end-user experience.
* Configuration variables that take a pathname as a value (e.g. blame.ignorerevsfile) can be marked as optional by prefixing ":(optoinal)" before its value.
* Show 'P'ipe command in "git add -p".
* "git sparse-checkout" subcommand learned a new "clean" action to prune otherwise unused working-tree files that are outside the areas of interest.
* "git fast-import" is taught to handle signed tags, just like it recently learned to handle signed commits, in different ways.
* A new configuration variable commitGraph.changedPaths allows to turn "--changed-paths" on by default for "git commit-graph".
* "Symlink symref" has been added to the list of things that will disappear at Git 3.0 boundary.
* "git maintenance" command learns the "geometric" strategy where it avoids doing maintenance tasks that rebuilds everything from scratch.
* "git repo structure", a new command.
* The help text and manual page of "git bisect" command have been made consistent with each other.
Performance, Internal Implementation, Development Support etc. --------------------------------------------------------------
* string_list_split*() family of functions have been extended to simplify common use cases.
* Arrays of strbuf is often a wrong data structure to use, and strbuf_split*() family of functions that create them often have better alternatives. Update several code paths and replace strbuf_split*().
* Revision traversal limited with pathspec, like "git log dir/*", used to ignore changed-paths Bloom filter when the pathspec contained wildcards; now they take advantage of the filter when they can.
* Doc lint updates to encourage the newer and easier-to-use `synopsis` format, with fixes to a handful of existing uses.
* Remove dependency on the_repository and other globals from the commit-graph code, and other changes unrelated to de-globaling.
* Discord has been added to the first contribution documentation as another way to ask for help.
* Inspired by Ezekiel's recent effort to showcase Rust interface, the hash function implementation used to hash lines have been updated to the one used for ELF symbol lookup by Glibc.
* Instead of scanning for the remaining items to see if there are still commits to be explored in the queue, use khash to remember which items are still on the queue (an unacceptable alternative is to reserve one object flag bits).
* The bulk-checkin code used to depend on a file-scope static singleton variable, which has been updated to pass an instance throughout the callchain.
* The work to build on the bulk-checkin infrastructure to create many objects at once in a transaction and to abstract it into the generic object layer continues.
* CodingGuidelines now spells out how bitfields are to be written.
* Adjust to the way newer versions of cURL selectively enable tracing options, so that our tests can continue to work.
* The clear_alloc_state() API function was not fully clearing the structure for reuse, but since nobody reuses it, replace it with a variant that frees the structure as well, making the callers simpler.
* "git range-diff" learned a way to limit the memory consumed by O(N*N) cost matrix.
* Some places in the code confused a variable that is *not* a boolean to enable color but is an enum that records what the user requested to do about color. A couple of bugs of this sort have been fixed, while the code has been cleaned up to prevent similar bugs in the future.
* The build procedure based on meson learned a target to only build documentation, similar to "make doc". (merge ff4ec8ded0 ps/meson-build-docs later to maint).
* Dip our toes a bit to (optionally) use Rust implemented helper called from our C code.
* Documentation for "git log --pretty" options has been updated to make it easier to translate.
* Instead of three library archives (one for git, one for reftable, and one for xdiff), roll everything into a single libgit.a archive. This would help later effort to FFI into Rust.
* The beginning of SHA1-SHA256 interoperability work.
* Build procedure for a few credential helpers (in contrib/) have been updated.
* CI improvements to handle the recent Rust integration better.
* The code in "git repack" machinery has been cleaned up to prepare for incremental update of midx files.
* Two slightly different ways to get at "all the packfiles" in API has been cleaned up.
* The code to walk revision graph to compute merge base has been optimized.
* AI guidelines has been added to our documentation set.
* Contributed credential helpers (obviously in contrib/) now have "cd $there && make install" target.
* The "MyFirstContribution" tutorial tells the reader how to send out their patches; the section gained a hint to verify the message reached the mailing list.
* The "debug" ref-backend was missing a method implementation, which has been corrected.
Fixes since v2.51 -----------------
Unless otherwise noted, all the changes in 2.51.X maintenance track, including security updates, are included in this release.
* During interactive rebase, using 'drop' on a merge commit lead to an error, which was incorrect.
* "git refs migrate" to migrate the reflog entries from a refs backend to another had a handful of bugs squashed.
* "git remote rename origin upstream" failed to move origin/HEAD to upstream/HEAD when origin/HEAD is unborn and performed other renames extremely inefficiently, which has been corrected. (merge 16c4fa26b9 ps/remote-rename-fix later to maint).
* "git describe" has been optimized by using better data structure. (merge 08bb69d70f rs/describe-with-prio-queue later to maint).
* "git push" had a code path that led to BUG() but it should have been a die(), as it is a response to a usual but invalid end-user action to attempt pushing an object that does not exist.
* Various bugs about rename handling in "ort" merge strategy have been fixed.
* "git jump" (in contrib/) fails to parse the diff header correctly when a file has a space in its name, which has been corrected. (merge 621ce9c1c6 gh/git-jump-pathname-with-sp later to maint).
* "git diff --no-index" run inside a subdirectory under control of a Git repository operated at the top of the working tree and stripped the prefix from the output, and oddballs like "-" (stdin) did not work correctly because of it. Correct the set-up by undoing what the set-up sequence did to cwd and prefix.
* Various options to "git diff" that makes comparison ignore certain aspects of the differences (like "space changes are ignored", "differences in lines that match these regular expressions are ignored") did not work well with "--name-only" and friends. (merge b55e6d36eb ly/diff-name-only-with-diff-from-content later to maint).
* The above caused regressions, which has been corrected.
* Documentation for "git rebase" has been updated. (merge 3f7f2b0359 je/doc-rebase later to maint).
* The start_delayed_progress() function in the progress eye-candy API did not clear its internal state, making an initial delay value larger than 1 second ineffective, which has been corrected.
* The compatObjectFormat extension is used to hide an incomplete feature that is not yet usable for any purpose other than developing the feature further. Document it as such to discourage its use by mere mortals.
* "git log -L..." compared trees of multiple parents with the tree of the merge result in an unnecessarily inefficient way. (merge 0a15bb634c sg/line-log-merge-optim later to maint).
* Under a race against another process that is repacking the repository, especially a partially cloned one, "git fetch" may mistakenly think some objects we do have are missing, which has been corrected.
* "git fetch" can clobber a symref that is dangling when the remote-tracking HEAD is set to auto update, which has been corrected.
* "git describe <blob>" misbehaves and/or crashes in some corner cases, which has been taught to exit with failure gracefully. (merge 7c10e48e81 jk/describe-blob later to maint).
* Manual page for "gitk" is updated with the current maintainer's name.
* Update the instructions for using GGG in the MyFirstContribution document to say that a GitHub PR could be made against `git/git` instead of `gitgitgadget/git`.
* Makefile tried to run multiple "cargo build" which would not work very well; serialize their execution to work around this problem.
* "git repack --path-walk" lost objects in some corner cases, which has been corrected.
* "git ls-files <pathspec>..." should not necessarily have to expand the index fully if a sparsified directory is excluded by the pathspec; the code is taught to expand the index on demand to avoid this. (merge 681f26bccc ds/ls-files-lazy-unsparse later to maint).
* Windows "real-time monitoring" interferes with the execution of tests and affects negatively in both correctness and performance, which has been disabled in Gitlab CI.
* A broken or malicious "git fetch" can say that it has the same object for many many times, and the upload-pack serving it can exhaust memory storing them redundantly, which has been corrected.
* A corner case bug in "git log -L..." has been corrected.
* "git rev-parse --short" and friends failed to disambiguate two objects with object names that share common prefix longer than 32 characters, which has been fixed. (merge 8655908b9e jc/longer-disambiguation-fix later to maint).
* Some among "git add -p" and friends ignored color.diff and/or color.ui configuration variables, which is an old regression, which has been corrected.
* "git subtree" (in contrib/) did not work correctly when splitting squashed subtrees, which has been improved.
* Import a newer version of the clar unit testing framework. (merge 93dbb6b3c5 ps/clar-updates later to maint).
* "git send-email --compose --reply-to=<address>" used to add duplicated Reply-To: header, which made mailservers unhappy. This has been corrected. (merge f448f65719 nb/send-email-no-dup-reply-to later to maint).
* "git rebase -i" failed to clean-up the commit log message when the command commits the final one in a chain of "fixup" commands, which has been corrected.
* There are double frees and leaks around setup_revisions() API used in "git stash show", which has been fixed, and setup_revisions() API gained a wrapper to make it more ergonomic when using it with strvec-manged argc/argv pairs. (merge a04bc71725 jk/setup-revisions-freefix later to maint).
* Deal more gracefully with directory / file conflicts when the files backend is used for ref storage, by failing only the ones that are involved in the conflict while allowing others.
* "git last-modified" operating in non-recursive mode used to trigger a BUG(), which has been corrected.
* The use of "git config get" command to learn how ANSI color sequence is for a particular type, e.g., "git config get --type=color --default=reset no.such.thing", isn't very ergonomic. (merge e4dabf4fd6 ps/config-get-color-fixes later to maint).
* The "do you still use it?" message given by a command that is deeply deprecated and allow us to suggest alternatives has been updated.
* Clang-format update to let our control macros be formatted the way we had them traditionally, e.g., "for_each_string_list_item()" without space before the parentheses.
* A few places where a size_t value was cast to curl_off_t without checking has been updated to use the existing helper function.
* "git reflog write" did not honor the configured user.name/email which has been corrected.
* Handling of an empty subdirectory of .git/refs/ in the ref-files backend has been corrected.
* Our CI script requires "sudo" that can be told to preserve environment, but Ubuntu replaced with "sudo" with an implementation that lacks the feature. Work this around by reinstalling the original version.
* The reftable backend learned to sanity check its on-disk data more carefully. (merge 466a3a1afd kn/reftable-consistency-checks later to maint).
* A lot of code clean-up of xdiff. Split out of a larger topic. (merge 8b9c5d2e3a en/xdiff-cleanup later to maint).
* "git format-patch --range-diff=... --notes=..." did not drive the underlying range-diff with correct --notes parameter, ending up comparing with different set of notes from its main patch output you would get from "git format-patch --notes=..." for a singleton patch.
* The code in "git add -p" and friends to iterate over hunks was riddled with bugs, which has been corrected.
* A few more things that patch authors can do to help maintainer to keep track of their topics better. (merge 1a41698841 tb/doc-submitting-patches later to maint).
* An earlier addition to "git diff --no-index A B" to limit the output with pathspec after the two directories misbehaved when these directories were given with a trailing slash, which has been corrected.
* The "--short" option of "git status" that meant output for humans and "-z" option to show NUL delimited output format did not mix well, and colored some but not all things. The command has been updated to color all elements consistently in such a case.
* Unicode width table update.
* GPG signing test set-up has been broken for a year, which has been corrected. (merge 516bf45749 jc/t1016-setup-fix later to maint).
* Recent OpenSSH creates the Unix domain socket to communicate with ssh-agent under $HOME instead of /tmp, which causes our test to fail doe to overly long pathname in our test environment, which has been worked around by using "ssh-agent -T".
* strbuf_split*() to split a string into multiple strbufs is often a wrong API to use. A few uses of it have been removed by simplifying the code. (merge 2ab72a16d9 ob/gpg-interface-cleanup later to maint).
* "git shortlog" knows "--committer" and "--author" options, which the command line completion (in contrib/) did not handle well, which has been corrected. (merge c568fa8e1c kf/log-shortlog-completion-fix later to maint).
* "git bisect" command did not react correctly to "git bisect help" and "git bisect unknown", which has been corrected. (merge 2bb3a012f3 rz/bisect-help-unknown later to maint).
* The 'q'(uit) command in "git add -p" has been improved to quit without doing any meaningless work before leaving, and giving EOF (typically control-D) to the prompt is made to behave the same way.
* The wildmatch code had a corner case bug that mistakenly makes "foo**/bar" match with "foobar", which has been corrected. (merge 1940a02dc1 jk/match-pathname-fix later to maint).
* Tests did not set up GNUPGHOME correctly, which is fixed but some flaky tests are exposed in t1016, which needs to be addressed before this topic can move forward. (merge 6cd8369ef3 tz/test-prepare-gnupghome later to maint).
* The patterns used in the .gitignore files use backslash in the way documented for fnmatch(3); document as such to reduce confusion. (merge 8a6d158a1d jk/doc-backslash-in-exclude later to maint).
* The version of macos image used in GitHub CI has been updated to macos-14, as the macos-13 that we have been using got deprecated. (merge 73b9cdb7c4 jc/ci-use-macos-14 later to maint).
* Other code cleanup, docfix, build fix, etc. (merge 529a60a885 ua/t1517-short-help-tests later to maint). (merge 22d421fed9 ac/deglobal-fmt-merge-log-config later to maint). (merge a60203a015 dk/t7005-editor-updates later to maint). (merge 16684b6fae ps/reftable-libgit2-cleanup later to maint). (merge e5c27bd3d8 je/doc-add later to maint). (merge 13296ac909 ps/object-store-midx-dedup-info later to maint). (merge f9a6705d9a tc/t0450-harden later to maint). (merge a66fc22bf9 rs/get-oid-with-flags-cleanup later to maint). (merge 15b8abde07 js/mingw-includes-cleanup later to maint). (merge 2cebca0582 tb/cat-file-objectmode-update later to maint). (merge 8f487db07a kh/doc-patch-id-1 later to maint). (merge f711f37b05 eb/t1016-hash-transition-fix later to maint). (merge 85333aa1af jk/test-delete-gpgsig-leakfix later to maint).
----------------------------------------------------------------
Changes since v2.51.0 are as follows:
Adam Dinwoodie (2):
t/t1517: mark tests that fail with GIT_TEST_INSTALLED
git-gui: sync Makefiles with git.gitAditya Garg (3):
send-email: add ability to send a copy of sent emails to an IMAP folder
send-email: enable copying emails to an IMAP folder without actually sending them
docs: update sendmail docs to use more secure SMTP server for GmailAlexander Monakov (1):
xdiff: optimize xdl_hash_record_verbatimAyush Chandekar (2):
environment: remove the global variable 'merge_log_config'
builtin/fmt-merge-msg: stop depending on 'the_repository'Christian Couder (15):
promisor-remote: refactor to get rid of 'struct strvec'
promisor-remote: allow a server to advertise more fields
promisor-remote: use string constants for 'name' and 'url' too
promisor-remote: refactor how we parse advertised fields
promisor-remote: use string_list_split() in filter_promisor_remote()
promisor-remote: allow a client to check fields
promisor-remote: use string_list_split() in mark_remotes_as_accepted()
gpg-interface: refactor 'enum sign_mode' parsing
fast-import: add '--signed-commits=<mode>' option
SubmittingPatches: add section about AI
doc: git-tag: stop focusing on GPG signed tags
lib-gpg: allow tests with GPGSM or GPGSSH prereq first
t9350: properly count annotated tags
fast-export: handle all kinds of tag signatures
fast-import: add '--signed-tags=<mode>' optionColin Stagner (1):
contrib/subtree: fix split with squashed subtreesD. Ben Knoble (10):
parse-options: refactor flags for usage_with_options_internal
builtin: also setup gently for --help-all
t7005: use modern test style
t7005: stop abusing --exec-path
t7005: sanitize test environment for subsequent tests
t3903: reduce dependencies on previous tests
t3905: remove unneeded blank line
stash: refactor private config globals
stash: honor stash.index in apply, pop modes
doc: explain the impact of stash.index on --autostash optionsDaniele Sassoli (3):
count-objects: document count-objects pack
doc: add discord to ways of getting help
doc: clarify which remotes can be used with GitGitGadgetDavid Aguilar (1):
Makefile: build libgit-rs and libgit-sys seriallyDenton Liu (3):
t5516: remove surrounding empty lines in test bodies
remote.c: remove BUG in show_push_unqualified_ref_name_error()
remote.c: convert if-else ladder to switchDerrick Stolee (17):
path-walk: fix setup of pending objects
path-walk: create initializer for path lists
ls-files: conditionally leave index sparse
midx-write: only load initialized packs
midx-write: put failing response value back
midx-write: use cleanup when incremental midx fails
midx-write: use uint32_t for preferred_pack_idx
midx-write: reenable signed comparison errors
midx-write: simplify error cases
sparse-checkout: remove use of the_repository
sparse-checkout: add basics of 'clean' command
sparse-checkout: match some 'clean' behavior
dir: add generic "walk all files" helper
sparse-checkout: add --verbose option to 'clean'
sparse-index: point users to new 'clean' action
t: expand tests around sparse merges and clean
sparse-index: improve advice message instructionsElijah Newren (8):
merge-ort: update comments to modern testfile location
merge-ort: drop unnecessary temporary in check_for_directory_rename()
t6423: document two bugs with rename-to-self testcases
t6423: fix missed staging of file in testcases 12i,12j,12k
merge-ort: clarify the interning of strings in opt->priv->path
merge-ort: fix incorrect file handling
merge-ort: fix directory rename on top of source of other rename/delete
Documentation/git-merge-tree.adoc: clarify the --merge-base optionEmily Yang (1):
commit-graph: add new config for changed-paths & recommend it in scalarEric Sunshine (1):
gitk: fix MacOS 10.14 "Mojave" crash on launchEric W. Biederman (1):
t1016-compatObjectFormat: really freeze time for reproduciblityEzekiel Newren (14):
xdiff: delete static forward declarations in xprepare
xdiff: delete local variables and initialize/free xdfile_t directly
xdiff: delete unnecessary fields from xrecord_t and xdfile_t
xdiff: delete superfluous function xdl_get_rec() in xemit
xdiff: delete local variables that alias fields in xrecord_t
xdiff: delete struct diffdata_t
xdiff: delete redundant array xdfile_t.ha
xdiff: delete fields ha, line, size in xdlclass_t in favor of an xrecord_t
xdiff: delete chastore from xdfile_t
xdiff: rename rchg -> changed in xdfile_t
make: delete XDIFF_LIB, add xdiff to LIB_OBJS
make: delete REFTABLE_LIB, add reftable to LIB_OBJS
xdiff: add macros DISCARD(0), KEEP(1), INVESTIGATE(2) in xprepare.c
xdiff: change type of xdfile_t.changed from char to boolGreg Hurrell (2):
git-jump: make `diff` work with filenames containing spaces
mailmap: consolidate multiple addresses into oneHeiko Voigt (1):
git-gui: provide question helper for retry fallback on WindowsJacob Keller (1):
diff --no-index: fix logic for paths ending in '/'Jean-Noël Avila (12):
doc: test linkgit macros for well-formedness
doc: check well-formedness of delimited sections
doc: check for absence of multiple terms in each entry of desc list
doc: check for absence of the form --[no-]parameter
doc:git-for-each-ref: fix styling and typos
doc lint: check that synopsis manpages have synopsis inlines
doc: fix asciidoc format compatibility in pretty-formats.adoc
doc: change the markup of paragraphs following a nested list item
doc: convert git-stash.adoc to synopis style
doc: convert git tag to synopsis style
doc: convert git worktree to synopsis style
doc: do not break sentences into "lego" piecesJeff King (47):
combine-diff: zero memory used for callback filepairs
diff: teach tree-diff a max-depth parameter
describe: pass oid struct by const pointer
describe: error if blob not found
describe: catch unborn branch in describe_blob()
t5510: make confusing config cleanup more explicit
t5510: stop changing top-level working directory
t5510: prefer "git -C" to subshell for followRemoteHEAD tests
refs: do not clobber dangling symrefs
describe: handle blob traversal with no commits
describe: pass commit to describe_commit()
fetch-pack: re-scan when double-checking graph objects
curl: add support for curl_global_trace() components
stash: pass --no-color to diff plumbing child processes
add-interactive: respect color.diff for diff coloring
add-interactive: manually fall back color config to color.ui
contrib/diff-highlight: mention interactive.diffFilter
color: use GIT_COLOR_* instead of numeric constants
color: return enum from git_config_colorbool()
grep: don't treat grep_opt.color as a strict bool
diff: simplify color_moved check when flushing
diff: don't use diff_options.use_color as a strict bool
diff: pass o->use_color directly to fill_metainfo()
diff: stop passing ecbdata->use_color as boolean
pretty: use format_commit_context.auto_color as colorbool
color: use git_colorbool enum type to store colorbools
color: return bool from want_color()
add-interactive: retain colorbool values longer
config: store want_color() result in a separate bool
stash: tell setup_revisions() to free our allocated strings
revision: manage memory ownership of argv in setup_revisions()
revision: add wrapper to setup_revisions() from a strvec
treewide: use setup_revisions_from_strvec() when we have a strvec
treewide: pass strvecs around for setup_revisions_from_strvec()
revision: retain argv NULL invariant in setup_revisions()
doc: fix indentation of refStorage item in git-config(1)
diff: restore redirection to /dev/null for diff_from_contents
status: make coloring of "-z --short" consistent
diff: send external diff output to diff_options.file
diff: drop save/restore of color_moved in dry-run mode
diff: replace diff_options.dry_run flag with NULL file
diff: drop dry-run redirection to /dev/null
diff: simplify run_external_diff() quiet logic
match_pathname(): reorder prefix-match check
match_pathname(): give fnmatch one char of prefix context
doc: document backslash in gitignore patterns
test-tool: fix leak in delete-gpgsig commandJohannes Schindelin (13):
git gui: set GIT_ASKPASS=git-gui--askpass if not set yet
git-gui--askyesno: allow overriding the window title
git-gui--askyesno (mingw): use Git for Windows' icon, if available
http: offer to cast `size_t` to `curl_off_t` safely
imap-send: be more careful when casting to `curl_off_t`
http-push: avoid new compile error
mingw: avoid relative `#include`s
mingw: order `#include`s alphabetically
refs: forbid clang to complain about unreachable code
build(deps): bump actions/download-artifact from 4 to 5
build(deps): bump actions/checkout from 4 to 5
build(deps): bump actions/setup-python from 5 to 6
build(deps): bump actions/github-script from 7 to 8Johannes Sixt (6):
rebase -i: permit 'drop' of a merge commit
doc/gitk: update reference to the external project
doc/format-patch: adjust Thunderbird MUA hint to new add-on
progress: pay attention to (customized) delay time
git-gui: fix error handling of Revert Changes command
t7500: fix tests with absolute path following ":(optional)" on WindowsJonathan Tan (1):
mailmap: change primary address for Jonathan TanJulia Evans (26):
doc: git-add: clarify intro & add an example
doc: git-add: simplify discussion of ignored files
doc: git-rebase: start with an example
doc: git rebase: dedup merge conflict discussion
doc: git rebase: clarify arguments syntax
doc: git-rebase: move --onto explanation down
doc: git-rebase: update discussion of internals
doc: rephrase the purpose of the staging area
doc: git-checkout: clarify intro sentence
doc: git-checkout: clarify ARGUMENT DISAMBIGUATION
doc: git-checkout: clarify `git checkout <branch>`
doc: git-checkout: clarify `-b` and `-B`
doc: git-checkout: deduplicate --detach explanation
doc: git-checkout: split up restoring files section
doc: git-checkout: clarify restoring files section
doc: git-push: create PUSH RULES section
doc: git-push: rewrite refspec specification
doc: git-push: clarify intro
doc: add an UPSTREAM BRANCHES section to pull/push/fetch
doc: git-push: clarify "where to push"
doc: git-push: clarify "what to push"
doc: git-push: add explanation of `git push origin main`
doc: git-pull: move <repository> and <refspec> params
doc: git-pull: clarify options for integrating remote branch
doc: git-pull: delete the example
doc: git-pull: clarify how to exit a conflicted mergeJunio C Hamano (62):
string-list: report programming error with BUG
string-list: align string_list_split() with its _in_place() counterpart
string-list: unify string_list_split* functions
string-list: optionally trim string pieces split by string_list_split*()
diff: simplify parsing of diff.colormovedws
string-list: optionally omit empty string pieces in string_list_split*()
string-list: split-then-remove-empty can be done while splitting
wt-status: avoid strbuf_split*()
clean: do not pass strbuf by value
clean: do not use strbuf_split*() [part 1]
clean: do not pass the whole structure when it is not necessary
clean: do not use strbuf_split*() [part 2]
merge-tree: do not use strbuf_split*()
notes: do not use strbuf_split*()
config: do not use strbuf_split()
environment: do not use strbuf_split*()
sub-process: do not use strbuf_split*()
trace2: trim_trailing_newline followed by trim is a no-op
trace2: do not use strbuf_split*()
diff: --no-index should ignore the worktree
abbrev: allow extending beyond 32 chars to disambiguate
config: document includeIf conditions consistently
Start 2.52 cycle, the first batch
The second batch
The third batch
The fourth batch
The fifth batch
The sixth batch
The seventh batch
The eighth batch
The ninth batch
The tenth batch
initial branch: give hints after switching the default name
The twelfth batch
t7500: make each piece more independent
The thirteenth batcn
The fourteenth batch
t7500: fix GIT_EDITOR shell snippet
config: values of pathname type can be prefixed with :(optional)
parseopt: values of pathname type can be prefixed with :(optional)
The fifteenth batch
The sixteenth batch
The seventeenth batch
t1016: make sure to use specified GPG
The eighteenth batch
The nineteenth batch
Prepare for 2.51.1
Git 2.51.1
The twentieth batch
The twenty-first batch
The twenty-second batch
diff: make sure the other caller of diff_flush_patch_quietly() is silent
The twenty-third batch
The twenty-fourth batch
Git 2.51.2
The 25th batch
The 26th batch
The 27th batch
Git 2.52-rc0
A bit more before rc1
GitHub CI: macos-13 images are no more
Git 2.52-rc1Justin Tobler (18):
bulk-checkin: introduce object database transaction structure
bulk-checkin: remove global transaction state
bulk-checkin: require transaction for index_blob_bulk_checkin()
bulk-checkin: use repository variable from transaction
bulk-checkin: remove ODB transaction nesting
builtin/update-index: end ODB transaction when --verbose is specified
bulk-checkin: drop flush_odb_transaction()
object-file: relocate ODB transaction code
object-file: update naming from bulk-checkin
odb: add transaction interface
clang-format: exclude control macros from SpaceBeforeParens
builtin/repo: rename repo_info() to cmd_repo_info()
ref-filter: allow NULL filter pattern
ref-filter: export ref_kind_from_refname()
builtin/repo: introduce structure subcommand
builtin/repo: add object counts in structure output
builtin/repo: add keyvalue and nul format for structure stats
builtin/repo: add progress meter for structure statsKIYOTA Fumiya (1):
completion: complete some 'git log' optionsKarthik Nayak (13):
Documentation: note styling for bit fields
refs/files: catch conflicts on case-insensitive file-systems
refs/files: use correct error type when lock exists
refs/files: handle F/D conflicts in case-insensitive FS
refs/files: handle D/F conflicts during locking
refs/ref-cache: fix SEGFAULT when seeking in empty directories
refs: remove unused headers
refs: move consistency check msg to generic layer
reftable: check for trailing newline in 'tables.list'
Documentation/fsck-msgids: remove duplicate msg id
fsck: order 'fsck_msg_type' alphabetically
reftable: add code to facilitate consistency checks
refs/reftable: add fsck check for checking the table nameKnut Harald Ryager (1):
docs: remove stray bracket from git-clone synopsisKristoffer Haugsbakk (24):
doc: git-log: fix description list
doc: interpret-trailers: close all pairs of single quotes
doc: config: replace backtick with apostrophe for possessive
doc: add missing backtick for inline-verbatim
doc: remove extra backtick for inline-verbatim
doc: fast-import: replace literal block with paragraph
Makefile: don’t add whatchanged after it has been removed
git: add `deprecated` category to --list-cmds
git: move seen-alias bookkeeping into handle_alias(...)
git: allow alias-shadowing deprecated builtins
t0014: test shadowing of aliases for a sample of builtins
you-still-use-that??: help the user help themselves
whatchanged: hint about git-log(1) and aliasing
whatchanged: remove not-even-shorter clause
BreakingChanges: remove claim about whatchanged reports
range-diff: rename other_arg to log_arg
revision: add rdiff_log_arg to rev_info
format-patch: handle range-diff on notes correctly for single patches
doc: patch-id: fix accidental literal blocks
doc: fix accidental literal blocks
doc: patch-id: convert to the modern synopsis style
RelNotes: minor fixups before 2.51.1
RelNotes: sync with Git 2.51.1 fixups
doc: git-checkout: fix placeholder markupKyle E. Mitchell (1):
doc: fix formatting of function-wrap shell aliasLidong Yan (3):
diff: ensure consistent diff behavior with ignore options
bloom: enable bloom filter with wildcard pathspec in revision traversal
diff: stop output garbled message in dry run modeLucas Seiki Oshiro (7):
repo: declare the repo command
repo: add the field references.format
repo: add the field layout.bare
repo: add the field layout.shallow
repo: add the --format flag
repo: add the flag -z as an alias for --format=nul
repo: add the field objects.formatM Hickford (1):
docs/gitcredentials: describe URL prefix matchingMark Levedahl (15):
git-gui: simplify PATH de-duplication
git-gui: simplify using nice(1)
gitk: use themed spinboxes
gitk: make sha1but a ttk::button
gitk: use config variables to define and load a theme
gitk: do not invoke tk_setPalette
gitk: use text labels for commit ID buttons
gitk: use text labels for next/prev search buttons
gitk: eliminate Interface color option from gui
gitk: eliminate unused ui color variables
gitk: add proc run_themeloader
gitk: add theme selection to color configuration page
gitk: make configuration dialog resizing useful
gitk: separate code blocks for configuration dialog
gitk: set minimum size on configuration dialogMeet Soni (19):
doc: factor out common option
builtin/for-each-ref: align usage string with the man page
builtin/for-each-ref: factor out core logic into a helper
builtin/refs: add list subcommand
t6300: refactor tests to be shareable
t: add test for git refs list subcommand
builtin/refs: add 'exists' subcommand
t1403: split 'show-ref --exists' tests into a separate file
t1422: refactor tests to be shareable
t: add test for git refs exists subcommand
refs: add a generic 'optimize' API
files-backend: implement 'optimize' action
reftable-backend: implement 'optimize' action
builtin/pack-refs: convert to use the generic refs_optimize() API
builtin/pack-refs: factor out core logic into a shared library
doc: pack-refs: factor out common options
builtin/refs: add optimize subcommand
t0601: refactor tests to be shareable
t: add test for git refs optimize subcommandMichael Lohmann (1):
builtin/reflog: respect user config in "write" subcommandMichael Rappazzo (2):
gitk: add README with usage, build, and contribution details
gitk: fix error when remote tracking branch is deletedMikhail Malinouski (1):
docs: fix typo in worktree.adoc 'extension'NeilBrown (1):
send-email: don't duplicate Reply-to: in intro messageOlamide Caleb Bello (2):
gpg-interface: do not use misdesigned strbuf_split*()
gpg-interface: do not use misdesigned strbuf_split*()Patrick Steinhardt (113):
Documentation/git-reflog: convert to use synopsis type
builtin/reflog: improve grouping of subcommands
refs: export `ref_transaction_update_reflog()`
builtin/reflog: implement subcommand to write new entries
ident: fix type of string length parameter
refs: fix identity for migrated reflogs
refs/files: detect race when generating reflog entry for HEAD
refs: stop unsetting REF_HAVE_OLD for log-only updates
refs: fix invalid old object IDs when migrating reflogs
refs: pass refname when invoking reflog entry callback
refs: simplify logic when migrating reflog entries
builtin/remote: fix sign comparison warnings
builtin/remote: determine whether refs need renaming early on
builtin/remote: rework how remote refs get renamed
builtin/remote: only iterate through refs that are to be renamed
odb: store locality in object database sources
odb: allow `odb_find_source()` to fail
odb: consistently use "dir" to refer to alternate's directory
odb: return newly created in-memory sources
odb: simplify calling `link_alt_odb_entry()`
midx: drop redundant `struct repository` parameter
midx: load multi-pack indices via their source
midx: write multi-pack indices via their source
midx: stop duplicating info redundant with its owning source
midx: compute paths via their source
reftable/writer: fix type used for number of records
reftable/writer: drop Git-specific `QSORT()` macro
reftable/stack: reorder code to avoid forward declarations
reftable/stack: fix compiler warning due to missing braces
reftable/stack: allow passing flags to `reftable_stack_add()`
reftable/stack: handle outdated stacks when compacting
reftable: don't second-guess errors from flock interface
refs/reftable: always reload stacks when creating lock
commit-graph: stop using `the_hash_algo` via macros
commit-graph: store the hash algorithm instead of its length
commit-graph: refactor `parse_commit_graph()` to take a repository
commit-graph: stop using `the_hash_algo`
commit-graph: stop using `the_repository`
commit-graph: stop passing in redundant repository
gitlab-ci: disable realtime monitoring to unbreak Windows jobs
blame: drop explicit check for commit graph
revision: drop explicit check for commit graph
commit-graph: return the prepared commit graph from `prepare_commit_graph()`
commit-graph: return commit graph from `repo_find_commit_pos_in_graph()`
commit-graph: pass graphs that are to be merged as parameter
t5530: modernize tests
upload-pack: don't ACK non-commits repeatedly in protocol v2
t/unit-tests: update clar to fcbed04
odb: drop deprecated wrapper functions
meson: introduce a "docs" alias to compile documentation only
meson: print docs backend as part of the summary
ci: don't compile whole project when testing docs with Meson
t1300: write test expectations in the test's body
t1300: small style fixups
builtin/config: do not die in `get_color()`
builtin/config: special-case retrieving colors without a key
builtin/config: do not spawn pager when printing color codes
t/unit-tests: update to 10e96bc
packfile: introduce a new `struct packfile_store`
odb: move list of packfiles into `struct packfile_store`
odb: move initialization bit into `struct packfile_store`
odb: move packfile map into `struct packfile_store`
odb: move MRU list of packfiles into `struct packfile_store`
odb: move kept cache into `struct packfile_store`
packfile: reorder functions to avoid function declaration
packfile: refactor `prepare_packed_git()` to work on packfile store
packfile: split up responsibilities of `reprepare_packed_git()`
packfile: refactor `install_packed_git()` to work on packfile store
packfile: introduce function to load and add packfiles
packfile: move `get_multi_pack_index()` into "midx.c"
packfile: refactor `get_packed_git()` to work on packfile store
packfile: refactor `get_all_packs()` to work on packfile store
packfile: refactor `get_packed_git_mru()` to work on packfile store
meson: add infrastructure to build internal Rust library
Makefile: reorder sources after includes
Makefile: introduce infrastructure to build internal Rust library
help: report on whether or not Rust is enabled
varint: use explicit width for integers
varint: reimplement as test balloon for Rust
BreakingChanges: announce Rust becoming mandatory
ci: convert "pedantic" job into full build with breaking changes
ci: enable Rust for breaking-changes jobs
gitlab-ci: dedup instructions to disable realtime monitoring
gitlab-ci: ignore failures to disable realtime monitoring
gitlab-ci: drop workaround for Python certificate store on Windows
gitlab-ci: upload Meson test logs as JUnit reports
t8020: fix test failure due to indeterministic tag sorting
ci: fix broken jobs on Ubuntu 25.10 caused by switch to sudo-rs(1)
ci: deduplicate calls to `apt-get update`
ci: check formatting of our Rust code
rust/varint: add safety comments
ci: check for common Rust mistakes via Clippy
ci: verify minimum supported Rust version
rust: support for Windows
refs/files: deprecate writing symrefs as symbolic links
object-name: convert to use `packfile_store_get_all_packs()`
builtin/gc: convert to use `packfile_store_get_all_packs()`
builtin/grep: simplify how we preload packs
packfile: drop `packfile_store_get_packs()`
packfile: introduce macro to iterate through packs
packfile: rename `packfile_store_get_all_packs()`
t7528: work around ETOOMANY in OpenSSH 10.1 and newer
builtin/gc: remove global `repack` variable
builtin/gc: make `too_many_loose_objects()` reusable without GC config
builtin/maintenance: introduce "geometric-repack" task
builtin/maintenance: make the geometric factor configurable
builtin/maintenance: don't silently ignore invalid strategy
builtin/maintenance: improve readability of strategies
builtin/maintenance: run maintenance tasks depending on type
builtin/maintenance: extend "maintenance.strategy" to manual maintenance
builtin/maintenance: make "gc" strategy accessible
builtin/maintenance: introduce "geometric" strategy
t7900: fix a flaky test due to git-repack always regenerating MIDXPaulo Casaretto (1):
range-diff: add configurable memory limit for cost matrixPhillip Wood (12):
xdiff: refactor xdl_hash_record()
breaking-changes: deprecate support for core.commentString=auto
config: warn on core.commentString=auto
commit: print advice when core.commentString=auto
breaking-changes: switch default branch to main
t4013: switch default branch name to main
t9902: switch default branch name to main
t0613: stop setting default initial branch
rebase -i: respect commit.cleanup when picking fixups
sequencer: remove VERBATIM_MSG flag
add -p: mark split hunks as undecided
add-patch: update hunk splitability after editingQueen Ediri Jessa (1):
MyFirstContribution: add note on confirming patchesRamsay Jones (6):
t6137-*.sh: fix test failure on cygwin
doc: add some missing technical documents
doc: remembering-renames.adoc: fix asciidoc warnings
doc: sparse-checkout.adoc: fix asciidoc warnings
doc: commit-graph.adoc: fix up some formatting
doc: add large-object-promisors.adoc to the docs buildRené Scharfe (15):
describe: use prio_queue
describe: use prio_queue_replace()
describe: use oidset in finish_depth_computation()
object-name: declare pointer type of extend_abbrev_len()'s 2nd parameter
use repo_get_oid_with_flags()
add-patch: improve help for options j, J, k, and K
add-patch: document that option J rolls over
add-patch: let options y, n, j, and e roll over to next undecided
add-patch: let options k and K roll over like j and J
add-patch: let options a and d roll over like y and n
add-patch: reset "permitted" at loop start
add-patch: fully document option P
commit-reach: avoid commit_list_insert_by_date()
add-patch: quit without skipping undecided hunks
add-patch: quit on EOFRuoyu Zhong (4):
gitk: use <Button-3> for ctx menus on macOS with Tcl 8.7+
gitk: fix trackpad scrolling for Tcl/Tk 8.7+
bisect: fix handling of `help` and invalid subcommands
bisect: update usage and docs to match each otherSZEDER Gábor (6):
line-log: fix assertion error
line-log: show all line ranges touched by the same diff range
line-log: avoid unnecessary tree diffs when processing merge commits
line-log: get rid of the parents array in process_ranges_merge_commit()
line-log: initialize diff queue in process_ranges_ordinary_commit()
line-log: simplify condition checking for merge commitsSolly (1):
t2401: update path checks using test_path helpersTaylor Blau (52):
SubmittingPatches: extend release-notes experiment to topic names
SubmittingPatches: guidance for multi-series efforts
builtin/cat-file.c: simplify calling `report_object_status()`
builtin/repack.c: avoid "the_repository" in `cmd_repack()`
builtin/repack.c: avoid "the_repository" in existing packs API
builtin/repack.c: avoid "the_repository" when taking a ref snapshot
builtin/repack.c: avoid "the_repository" when removing packs
builtin/repack.c: avoid "the_repository" when repacking promisor objects
builtin/repack.c: avoid "the_hash_algo" when deleting packs
builtin/repack.c: avoid "the_hash_algo" in `write_oid()`
builtin/repack: avoid "the_hash_algo" in `repack_promisor_objects()`
builtin/repack.c: avoid "the_hash_algo" in `finish_pack_objects_cmd()`
builtin/repack.c: avoid using `hash_to_hex()` in pack geometry
repack: introduce new compilation unit
builtin/repack.c: pass both pack_objects args to repack_config
repack: move 'delta_base_offset' to 'struct pack_objects_args'
repack: remove 'prepare_pack_objects' from the builtin
builtin/repack.c: rename many 'struct existing_packs' functions
repack: remove 'remove_redundant_pack' from the builtin
builtin/repack.c: pass "packdir" when removing packs
builtin/repack.c: avoid unnecessary numeric casts in existing_packs
repack: remove 'existing_packs' API from the builtin
builtin/repack.c: rename "struct generated_pack_data"
builtin/repack.c: factor out "generated_pack_install"
builtin/repack.c: pass "packtmp" to `generated_pack_populate()`
builtin/repack.c: provide pack locations to `generated_pack_install()`
repack: remove 'generated_pack' API from the builtin
builtin/repack.c: pass "packtmp" to `repack_promisor_objects()`
builtin/repack.c: remove "repack_promisor_objects()" from the builtin
builtin/repack.c: rename various pack_geometry functions
builtin/repack.c: pass 'pack_kept_objects' to `pack_geometry_init()`
builtin/repack.c: pass 'packdir' to `pack_geometry_remove_redundant()`
repack: remove pack_geometry API from the builtin
builtin/repack.c: remove ref snapshotting from builtin
builtin/repack.c: extract opts struct for 'write_midx_included_packs()'
builtin/repack.c: use a string_list for 'midx_pack_names'
repack: keep track of MIDX pack names using existing_packs
builtin/repack.c: reorder `remove_redundant_bitmaps()`
builtin/repack.c: inline `remove_redundant_bitmaps()`
builtin/repack.c: pass `repack_write_midx_opts` to `midx_included_packs`
builtin/repack.c: inline packs within `write_midx_included_packs()`
repack: 'write_midx_included_packs' API from the builtin
builtin/repack.c: introduce `struct write_pack_opts`
builtin/repack.c: use `write_pack_opts` within `write_cruft_pack()`
repack: move `find_pack_prefix()` out of the builtin
repack: extract `write_pack_opts_is_local()`
builtin/repack.c: pass `write_pack_opts` to `finish_pack_objects_cmd()`
repack: move `finish_pack_objects_cmd()` out of the builtin
repack: move `pack_kept_objects` to `struct pack_objects_args`
repack: move `write_filtered_pack()` out of the builtin
repack: move `write_cruft_pack()` out of the builtin
builtin/repack.c: clean up unused `#include`sThomas Uhle (2):
contrib/credential: harmonize Makefiles
contrib/credential: add install targetTodd Zullinger (2):
t/lib-gpg: add prepare_gnupghome() to create GNUPGHOME dir
t/lib-gpg: call prepare_gnupghome() in GPG2 prereqToon Claes (7):
within_depth: fix return for empty path
t0450: fix test for out-of-tree builds
last-modified: new subcommand to show when files were last modified
t/perf: add last-modified perf script
last-modified: use Bloom filters when available
t0450: add allowlist for builtins with missing .adoc
last-modified: fix bug when some paths remain unhandledTorsten Bögershausen (1):
unicode: update the width tables to Unicode 17Usman Akinyemi (3):
t/t1517: automate `git subcmd -h` tests outside a repository
t5200: move `update-server-info -h` test from t1517
t5304: move `prune -h` test from t1517Xinyu Ruan (1):
refs: add missing remove_on_disk implementation for debug backendbrian m. carlson (10):
docs: note that extensions.compatobjectformat is incomplete
docs: update pack index v3 format
docs: update offset order for pack index v3
docs: reflect actual double signature for tags
docs: improve ambiguous areas of pack format documentation
docs: add documentation for loose objects
rev-parse: allow printing compatibility hash
fsck: consider gpgsig headers expected in tags
t: allow specifying compatibility hash
t1010: use BROKEN_OBJECTS prerequisiteshejialuo (4):
string-list: use bool instead of int for "exact_match"
string-list: replace negative index encoding with "exact_match" parameter
string-list: change "string_list_find_insert_index" return type to "size_t"
refs: enable sign compare warnings checkノウラ | Flare (1):
alloc: fix dangling pointer in alloc_state cleanup