]> Kevux Git Server - rit/log
rit
4 months agopromisor-remote: change promisor_remote_reply()'s signature
Christian Couder [Mon, 16 Feb 2026 13:23:14 +0000 (14:23 +0100)]
promisor-remote: change promisor_remote_reply()'s signature

The `promisor_remote_reply()` function performs two tasks:
1. It uses filter_promisor_remote() to parse the server's
   "promisor-remote" advertisement and to mark accepted remotes in the
   repository configuration.
2. It assembles a reply string containing the accepted remote names to
   send back to the server.

In a following commit, the fetch-pack logic will need to trigger the
side effect (1) to ensure the repository state is correct, but it will
not need to send a reply (2).

To avoid assembling a reply string when it is not needed, let's change
the signature of promisor_remote_reply(). It will now return `void` and
accept a second `char **accepted_out` argument. Only if that argument
is not NULL will a reply string be assembled and returned back to the
caller via that argument.

Signed-off-by: Christian Couder <chriscool@tuxfamily.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 months agopromisor-remote: keep advertised filters in memory
Christian Couder [Mon, 16 Feb 2026 13:23:13 +0000 (14:23 +0100)]
promisor-remote: keep advertised filters in memory

Currently, advertised filters are only kept in memory temporarily
during parsing, or persisted to disk if `promisor.storeFields`
contains 'partialCloneFilter'.

In a following commit though, we will add a `--filter=auto` option.
This option will enable the client to use the filters that the server
is suggesting for the promisor remotes the client accepts.

To use them even if `promisor.storeFields` is not configured, these
filters should be stored somewhere for the current session.

Let's add an `advertised_filter` field to `struct promisor_remote`
for that purpose.

To ensure that the filters are available in all cases,
filter_promisor_remote() captures them into a temporary list and
applies them to the `promisor_remote` structs after the potential
configuration reload.

Then the accepted remotes are marked as `accepted` in the repository
state. This ensures that subsequent calls to look up accepted remotes
(like in the filter construction below) actually find them.

In a following commit, we will add a `--filter=auto` option that will
enable a client to use the filters suggested by the server for the
promisor remotes the client accepted.

To enable the client to construct a filter spec based on these filters,
let's also add a `promisor_remote_construct_filter(repo)` function.

This function:

- iterates over all accepted promisor remotes in the repository,
- collects the filters advertised for them (using `advertised_filter`
  added in this commit, and
- generates a single filter spec for them.

Signed-off-by: Christian Couder <chriscool@tuxfamily.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 months agolist-objects-filter-options: support 'auto' mode for --filter
Christian Couder [Mon, 16 Feb 2026 13:23:12 +0000 (14:23 +0100)]
list-objects-filter-options: support 'auto' mode for --filter

In a following commit, we are going to allow passing "auto" as a
<filterspec> to the `--filter=<filterspec>` option, but only for some
commands. Other commands that support the `--filter=<filterspec>`
option should still die() when 'auto' is passed.

Let's set up the "list-objects-filter-options.{c,h}" infrastructure to
support that:

- Add a new `unsigned int allow_auto_filter : 1;` flag to
  `struct list_objects_filter_options` which specifies if "auto" is
  accepted or not by the current command.
- Change gently_parse_list_objects_filter() to parse "auto" if it's
  accepted.
- Make sure we die() if "auto" is combined with another filter.
- Update list_objects_filter_release() to preserve the
  allow_auto_filter flag, as this function is often called (via
  opt_parse_list_objects_filter) to reset the struct before parsing a
  new value.

Let's also update `list-objects-filter.c` to recognize the new
`LOFC_AUTO` choice. Since "auto" must be resolved to a concrete filter
before filtering actually begins, initializing a filter with
`LOFC_AUTO` is invalid and will trigger a BUG().

Note that ideally combining "auto" with "auto" could be allowed, but in
practice, it's probably not worth the added code complexity. And if we
really want it, nothing prevents us to allow it in future work.

If we ever want to give a meaning to combining "auto" with a different
filter too, nothing prevents us to do that in future work either.

Also note that the new `allow_auto_filter` flag depends on the command,
not user choices, so it should be reset to the command default when
`struct list_objects_filter_options` instances are reset.

While at it, let's add a new "u-list-objects-filter-options.c" file for
`struct list_objects_filter_options` related unit tests. For now it
only tests gently_parse_list_objects_filter() though.

Signed-off-by: Christian Couder <chriscool@tuxfamily.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 months agodoc: fetch: document `--filter=<filter-spec>` option
Christian Couder [Mon, 16 Feb 2026 13:23:11 +0000 (14:23 +0100)]
doc: fetch: document `--filter=<filter-spec>` option

The `--filter=<filter-spec>` option is documented in most commands that
support it except `git fetch`.

Let's fix that and document this option. To ensure consistency across
commands, let's reuse the exact description currently found in
`git clone`.

Signed-off-by: Christian Couder <chriscool@tuxfamily.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 months agofetch: make filter_options local to cmd_fetch()
Christian Couder [Mon, 16 Feb 2026 13:23:10 +0000 (14:23 +0100)]
fetch: make filter_options local to cmd_fetch()

The `struct list_objects_filter_options filter_options` variable used
in "builtin/fetch.c" to store the parsed filters specified by
`--filter=<filterspec>` is currently a static variable global to the
file.

As we are going to use it more in a following commit, it could become a
bit less easy to understand how it's managed.

To avoid that, let's make it clear that it's owned by cmd_fetch() by
moving its definition into that function and making it non-static.

This requires passing a pointer to it through the prepare_transport(),
do_fetch(), backfill_tags(), fetch_one_setup_partial(), and fetch_one()
functions, but it's quite straightforward.

Signed-off-by: Christian Couder <chriscool@tuxfamily.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 months agoclone: make filter_options local to cmd_clone()
Christian Couder [Mon, 16 Feb 2026 13:23:09 +0000 (14:23 +0100)]
clone: make filter_options local to cmd_clone()

The `struct list_objects_filter_options filter_options` variable used
in "builtin/clone.c" to store the parsed filters specified by
`--filter=<filterspec>` is currently a static variable global to the
file.

As we are going to use it more in a following commit, it could become
a bit less easy to understand how it's managed.

To avoid that, let's make it clear that it's owned by cmd_clone() by
moving its definition into that function and making it non-static.

The only additional change to make this work is to pass it as an
argument to checkout(). So it's a small quite cheap cleanup anyway.

Signed-off-by: Christian Couder <chriscool@tuxfamily.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 months agopromisor-remote: allow a client to store fields
Christian Couder [Mon, 16 Feb 2026 13:23:08 +0000 (14:23 +0100)]
promisor-remote: allow a client to store fields

A previous commit allowed a server to pass additional fields through
the "promisor-remote" protocol capability after the "name" and "url"
fields, specifically the "partialCloneFilter" and "token" fields.

Another previous commit, c213820c51 (promisor-remote: allow a client
to check fields, 2025-09-08), has made it possible for a client to
decide if it accepts a promisor remote advertised by a server based
on these additional fields.

Often though, it would be interesting for the client to just store in
its configuration files these additional fields passed by the server,
so that it can use them when needed.

For example if a token is necessary to access a promisor remote, that
token could be updated frequently only on the server side and then
passed to all the clients through the "promisor-remote" capability,
avoiding the need to update it on all the clients manually.

Storing the token on the client side makes sure that the token is
available when the client needs to access the promisor remotes for a
lazy fetch.

To allow this, let's introduce a new "promisor.storeFields"
configuration variable.

Note that for a partial clone filter, it's less interesting to have
it stored on the client. This is because a filter should be used
right away and we already pass a `--filter=<filter-spec>` option to
`git clone` when starting a partial clone. Storing the filter could
perhaps still be interesting for information purposes.

Like "promisor.checkFields" and "promisor.sendFields", the new
configuration variable should contain a comma or space separated list
of field names. Only the "partialCloneFilter" and "token" field names
are supported for now.

When a server advertises a promisor remote, for example "foo", along
with for example "token=XXXXX" to a client, and on the client side
"promisor.storeFields" contains "token", then the client will store
XXXXX for the "remote.foo.token" variable in its configuration file
and reload its configuration so it can immediately use this new
configuration variable.

A message is emitted on stderr to warn users when the config is
changed.

Note that even if "promisor.acceptFromServer" is set to "all", a
promisor remote has to be already configured on the client side for
some of its config to be changed. In any case no new remote is
configured and no new URL is stored.

Signed-off-by: Christian Couder <chriscool@tuxfamily.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
4 months agopromisor-remote: refactor initialising field lists
Christian Couder [Mon, 16 Feb 2026 13:23:07 +0000 (14:23 +0100)]
promisor-remote: refactor initialising field lists

In "promisor-remote.c", the fields_sent() and fields_checked()
functions serve similar purposes and contain a small amount of
duplicated code.

As we are going to add a similar function in a following commit,
let's refactor this common code into a new initialize_fields_list()
function.

Signed-off-by: Christian Couder <chriscool@tuxfamily.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
5 months agoThe second batch
Junio C Hamano [Mon, 9 Feb 2026 20:08:48 +0000 (12:08 -0800)]
The second batch

Signed-off-by: Junio C Hamano <gitster@pobox.com>
5 months agoMerge branch 'ty/perf-3400-optim'
Junio C Hamano [Mon, 9 Feb 2026 20:09:10 +0000 (12:09 -0800)]
Merge branch 'ty/perf-3400-optim'

Improve set-up time of a perf test.

* ty/perf-3400-optim:
  t/perf/p3400: speed up setup using fast-import

5 months agoMerge branch 'ac/string-list-sort-u-and-tests'
Junio C Hamano [Mon, 9 Feb 2026 20:09:10 +0000 (12:09 -0800)]
Merge branch 'ac/string-list-sort-u-and-tests'

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

* ac/string-list-sort-u-and-tests:
  string-list: add string_list_sort_u() that mimics "sort -u"
  u-string-list: add unit tests for string-list methods

5 months agoMerge branch 'sb/doc-worktree-prune-expire-improvement'
Junio C Hamano [Mon, 9 Feb 2026 20:09:10 +0000 (12:09 -0800)]
Merge branch 'sb/doc-worktree-prune-expire-improvement'

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

* sb/doc-worktree-prune-expire-improvement:
  worktree: clarify that --expire only affects missing worktrees

5 months agoMerge branch 'kn/ref-batch-output-error-reporting-fix'
Junio C Hamano [Mon, 9 Feb 2026 20:09:10 +0000 (12:09 -0800)]
Merge branch 'kn/ref-batch-output-error-reporting-fix'

A handful of code paths that started using batched ref update API
(after Git 2.51 or so) lost detailed error output, which have been
corrected.

* kn/ref-batch-output-error-reporting-fix:
  fetch: delay user information post committing of transaction
  receive-pack: utilize rejected ref error details
  fetch: utilize rejected ref error details
  update-ref: utilize rejected error details if available
  refs: add rejection detail to the callback function
  refs: skip to next ref when current ref is rejected

5 months agoMerge branch 'pw/replay-drop-empty'
Junio C Hamano [Mon, 9 Feb 2026 20:09:09 +0000 (12:09 -0800)]
Merge branch 'pw/replay-drop-empty'

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

* pw/replay-drop-empty:
  replay: drop commits that become empty

5 months agoMerge branch 'ps/history'
Junio C Hamano [Mon, 9 Feb 2026 20:09:09 +0000 (12:09 -0800)]
Merge branch 'ps/history'

"git history" history rewriting UI.

* ps/history:
  builtin/history: implement "reword" subcommand
  builtin: add new "history" command
  wt-status: provide function to expose status for trees
  replay: support updating detached HEAD
  replay: support empty commit ranges
  replay: small set of cleanups
  builtin/replay: move core logic into "libgit.a"
  builtin/replay: extract core logic to replay revisions

5 months agoStart 2.54 cycle
Junio C Hamano [Thu, 5 Feb 2026 23:07:22 +0000 (15:07 -0800)]
Start 2.54 cycle

Signed-off-by: Junio C Hamano <gitster@pobox.com>
5 months agoMerge branch 'sp/t5500-cleanup'
Junio C Hamano [Thu, 5 Feb 2026 23:42:01 +0000 (15:42 -0800)]
Merge branch 'sp/t5500-cleanup'

Test clean-up.

* sp/t5500-cleanup:
  t5500: simplify test implementation and fix git exit code suppression

5 months agoMerge branch 'tc/last-modified-options-cleanup'
Junio C Hamano [Thu, 5 Feb 2026 23:42:01 +0000 (15:42 -0800)]
Merge branch 'tc/last-modified-options-cleanup'

The "-z" and "--max-depth" documentation (and implementation of
"-z") in the "git last-modified" command have been updated.

* tc/last-modified-options-cleanup:
  last-modified: change default max-depth to 0
  last-modified: document option '--max-depth'
  last-modified: document option '-z'
  last-modified: clarify in the docs the command takes a pathspec

5 months agoMerge branch 'lp/diff-stat-utf8-display-width-fix'
Junio C Hamano [Thu, 5 Feb 2026 23:42:01 +0000 (15:42 -0800)]
Merge branch 'lp/diff-stat-utf8-display-width-fix'

The computation of column width made by "git diff --stat" was
confused when pathnames contain non-ASCII characters.

* lp/diff-stat-utf8-display-width-fix:
  t4073: add test for diffstat paths length when containing UTF-8 chars
  diff: improve scaling of filenames in diffstat to handle UTF-8 chars

5 months agoMerge branch 'ac/sparse-checkout-string-list-cleanup'
Junio C Hamano [Thu, 5 Feb 2026 23:42:00 +0000 (15:42 -0800)]
Merge branch 'ac/sparse-checkout-string-list-cleanup'

Code clean-up.

* ac/sparse-checkout-string-list-cleanup:
  sparse-checkout: optimize string_list construction and add tests to verify deduplication.

5 months agoMerge branch 'sp/myfirstcontribution-include-update'
Junio C Hamano [Thu, 5 Feb 2026 23:42:00 +0000 (15:42 -0800)]
Merge branch 'sp/myfirstcontribution-include-update'

Doc update.

* sp/myfirstcontribution-include-update:
  doc: MyFirstContribution: fix missing dependencies and clarify build steps

5 months agoMerge branch 'dd/t5403-modernise'
Junio C Hamano [Thu, 5 Feb 2026 23:42:00 +0000 (15:42 -0800)]
Merge branch 'dd/t5403-modernise'

Test clean-up.

* dd/t5403-modernise:
  t5403: use test_cmp for post-checkout argument checks
  t5403: introduce check_post_checkout helper function

5 months agoMerge branch 'ap/http-probe-rpc-use-auth'
Junio C Hamano [Thu, 5 Feb 2026 23:41:58 +0000 (15:41 -0800)]
Merge branch 'ap/http-probe-rpc-use-auth'

HTTP transport failed to authenticate in some code paths, which has
been corrected.

* ap/http-probe-rpc-use-auth:
  remote-curl: use auth for probe_rpc() requests too

5 months agoMerge branch 'ar/submodule-gitdir-tweak'
Junio C Hamano [Thu, 5 Feb 2026 23:41:58 +0000 (15:41 -0800)]
Merge branch 'ar/submodule-gitdir-tweak'

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

* ar/submodule-gitdir-tweak:
  submodule: detect conflicts with existing gitdir configs
  submodule: hash the submodule name for the gitdir path
  submodule: fix case-folding gitdir filesystem collisions
  submodule--helper: fix filesystem collisions by encoding gitdir paths
  builtin/credential-store: move is_rfc3986_unreserved to url.[ch]
  submodule--helper: add gitdir migration command
  submodule: allow runtime enabling extensions.submodulePathConfig
  submodule: introduce extensions.submodulePathConfig
  builtin/submodule--helper: add gitdir command
  submodule: always validate gitdirs inside submodule_name_to_gitdir
  submodule--helper: use submodule_name_to_gitdir in add_submodule

5 months agoMerge branch 'aa/add-p-previous-decisions'
Junio C Hamano [Thu, 5 Feb 2026 23:41:58 +0000 (15:41 -0800)]
Merge branch 'aa/add-p-previous-decisions'

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

* aa/add-p-previous-decisions:
  add -p: show user's hunk decision when selecting hunks

5 months agoMerge branch 'jk/remote-tracking-ref-leakfix'
Junio C Hamano [Thu, 5 Feb 2026 23:41:57 +0000 (15:41 -0800)]
Merge branch 'jk/remote-tracking-ref-leakfix'

Leakfix.

* jk/remote-tracking-ref-leakfix:
  remote: always allocate branch.push_tracking_ref
  remote: fix leak in branch_get_push_1() with invalid "simple" config
  remote: drop const return of tracking_for_push_dest()
  remote: return non-const pointer from error_buf()

5 months ago.mailmap: fix email for Phil Hord
Phil Hord [Tue, 3 Feb 2026 18:12:13 +0000 (10:12 -0800)]
.mailmap: fix email for Phil Hord

My canonical and old emails were reversed, somehow. Also add
an entry for a new email that may sneak in.

Signed-off-by: Phil Hord <phil.hord@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
5 months agoGit 2.53
Junio C Hamano [Mon, 2 Feb 2026 02:15:01 +0000 (18:15 -0800)]
Git 2.53

Signed-off-by: Junio C Hamano <gitster@pobox.com>
5 months agoMerge tag 'l10n-2.53.0-v1' of https://github.com/git-l10n/git-po
Junio C Hamano [Mon, 2 Feb 2026 02:13:52 +0000 (18:13 -0800)]
Merge tag 'l10n-2.53.0-v1' of https://github.com/git-l10n/git-po

l10n-2.53.0-v1

* tag 'l10n-2.53.0-v1' of https://github.com/git-l10n/git-po:
  l10n: zh_CN: standardize glossary terms
  l10n: zh_CN: updated translation for 2.53
  l10n: zh_CN: fix inconsistent use of standard vs. wide colons
  l10n: fr: v2.53
  l10n: zh_TW.po: update Git 2.53 translation
  l10n: tr: Update Turkish translations
  l10n: sv.po: Update Swedish translation
  l10n: po-id for 2.53
  l10n: ga.po: Fix git-po-helper warnings
  l10n: bg.po: Updated Bulgarian translation (6091t)
  l10n: ga.po: Update Irish translation for Git 2.53

5 months agoRelNotes: fully spell negation
Carlo Marcelo Arenas Belón [Sat, 31 Jan 2026 23:08:48 +0000 (15:08 -0800)]
RelNotes: fully spell negation

Signed-off-by: Carlo Marcelo Arenas Belón <carenas@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
5 months agoMerge branch 'jx/zh_CN' of github.com:jiangxin/git
Jiang Xin [Sat, 31 Jan 2026 13:32:54 +0000 (21:32 +0800)]
Merge branch 'jx/zh_CN' of github.com:jiangxin/git

* 'jx/zh_CN' of github.com:jiangxin/git:
  l10n: zh_CN: standardize glossary terms
  l10n: zh_CN: updated translation for 2.53
  l10n: zh_CN: fix inconsistent use of standard vs. wide colons

5 months agoMerge branch 'l10n/zh-TW/git-2-53' of github.com:l10n-tw/git-po
Jiang Xin [Sat, 31 Jan 2026 13:20:06 +0000 (21:20 +0800)]
Merge branch 'l10n/zh-TW/git-2-53' of github.com:l10n-tw/git-po

* 'l10n/zh-TW/git-2-53' of github.com:l10n-tw/git-po:
  l10n: zh_TW.po: update Git 2.53 translation

5 months agoMerge branch 'po-id' of github.com:bagasme/git-po
Jiang Xin [Sat, 31 Jan 2026 13:15:38 +0000 (21:15 +0800)]
Merge branch 'po-id' of github.com:bagasme/git-po

* 'po-id' of github.com:bagasme/git-po:
  l10n: po-id for 2.53

5 months agoMerge branch 'l10n-ga-2.53' of github.com:aindriu80/git-po
Jiang Xin [Sat, 31 Jan 2026 13:13:55 +0000 (21:13 +0800)]
Merge branch 'l10n-ga-2.53' of github.com:aindriu80/git-po

* 'l10n-ga-2.53' of github.com:aindriu80/git-po:
  l10n: ga.po: Fix git-po-helper warnings
  l10n: ga.po: Update Irish translation for Git 2.53

5 months agoMerge branch 'master' of github.com:alshopov/git-po
Jiang Xin [Sat, 31 Jan 2026 13:11:50 +0000 (21:11 +0800)]
Merge branch 'master' of github.com:alshopov/git-po

* 'master' of github.com:alshopov/git-po:
  l10n: bg.po: Updated Bulgarian translation (6091t)

5 months agoMerge branch 'fr_2.53' of github.com:jnavila/git
Jiang Xin [Sat, 31 Jan 2026 13:08:43 +0000 (21:08 +0800)]
Merge branch 'fr_2.53' of github.com:jnavila/git

* 'fr_2.53' of github.com:jnavila/git:
  l10n: fr: v2.53

5 months agoMerge branch 'tr-l10n' of github.com:bitigchi/git-po
Jiang Xin [Sat, 31 Jan 2026 13:06:38 +0000 (21:06 +0800)]
Merge branch 'tr-l10n' of github.com:bitigchi/git-po

* 'tr-l10n' of github.com:bitigchi/git-po:
  l10n: tr: Update Turkish translations

5 months agoMerge branch 'master' of github.com:nafmo/git-l10n-sv
Jiang Xin [Sat, 31 Jan 2026 13:03:10 +0000 (21:03 +0800)]
Merge branch 'master' of github.com:nafmo/git-l10n-sv

* 'master' of github.com:nafmo/git-l10n-sv:
  l10n: sv.po: Update Swedish translation

5 months agol10n: zh_CN: standardize glossary terms
Jiang Xin [Fri, 30 Jan 2026 02:38:47 +0000 (10:38 +0800)]
l10n: zh_CN: standardize glossary terms

Add preferred Chinese terminology notes and align existing translations
to the updated glossary. AI-assisted review was used to check and
improve legacy translations.

Signed-off-by: Jiang Xin <worldhello.net@gmail.com>
5 months agoRelNotes: correct "fast-import" option name
Junio C Hamano [Fri, 30 Jan 2026 17:50:03 +0000 (09:50 -0800)]
RelNotes: correct "fast-import" option name

Signed-off-by: Junio C Hamano <gitster@pobox.com>
5 months agot/perf/p3400: speed up setup using fast-import
Tian Yuchen [Fri, 30 Jan 2026 17:01:23 +0000 (01:01 +0800)]
t/perf/p3400: speed up setup using fast-import

The setup phase in 't/perf/p3400-rebase.sh' generates 100 commits to
simulate a noisy history. It currently uses a shell loop that invokes
'git add', 'git commit', 'test_seq', and 'sort' in each iteration.
This incurs significant overhead due to repeated process spawning.

Optimize the setup by using 'git fast-import' to generate the commit
history. Additionally, pre-compute the forward and reversed file contents
to avoid repetitive execution of 'seq' and 'sort'.

To ensure the test measures rebase performance against a consistent
object layout (rather than the suboptimal pack/loose objects created
by the raw import), perform a full repack (`git repack -a -d`) at the
end of the setup.

This reduces the setup time significantly while maintaining the validity
of the subsequent performance tests.

Performance enhancement (Average value of 5 tests):
            Real        Rebase
  Before:  29.045s      13.34s
   After:  21.989s      12.84s

Measured on Lenovo Yoga 2020, Ubuntu 24.04.

Signed-off-by: Tian Yuchen <a3205153416@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
5 months agostring-list: add string_list_sort_u() that mimics "sort -u"
Amisha Chhajed [Thu, 29 Jan 2026 12:12:20 +0000 (17:42 +0530)]
string-list: add string_list_sort_u() that mimics "sort -u"

Many callsites of string_list_remove_duplicates() call it
immdediately after calling string_list_sort(), understandably
as the former requires string-list to be sorted, it is clear
that these places are sorting only to remove duplicates and
for no other reason.

Introduce a helper function string_list_sort_u that combines
these two calls that often appear together, to simplify
these callsites. Replace the current calls of those methods with
string_list_sort_u().

Signed-off-by: Amisha Chhajed <amishhhaaaa@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
5 months agou-string-list: add unit tests for string-list methods
Amisha Chhajed [Thu, 29 Jan 2026 12:12:19 +0000 (17:42 +0530)]
u-string-list: add unit tests for string-list methods

Unit tests in u-string-list.c does not cover several methods
in string-list, this gap in coverage makes it difficult to
ensure no regressions are introduced in future changes.

Add unit tests for the following methods to enhance coverage:
string_list_remove_empty_items()
unsorted_string_list_has_string()
unsorted_string_list_delete_item()
string_list_has_string()
string_list_insert()
string_list_sort()
string_list_remove()

Signed-off-by: Amisha Chhajed <amishhhaaaa@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
5 months agol10n: zh_CN: updated translation for 2.53
Jiang Xin [Thu, 29 Jan 2026 12:30:39 +0000 (20:30 +0800)]
l10n: zh_CN: updated translation for 2.53

Signed-off-by: Jiang Xin <worldhello.net@gmail.com>
5 months agol10n: zh_CN: fix inconsistent use of standard vs. wide colons
Jiang Xin [Thu, 29 Jan 2026 13:41:39 +0000 (21:41 +0800)]
l10n: zh_CN: fix inconsistent use of standard vs. wide colons

Replace mixed usage of standard (ASCII) colons ':' with full-width
(wide) colons ':' in Chinese translations to ensure typographic
consistency, as reported by CAESIUS-TIM [1].

Full-width punctuation is preferred in Chinese localization for better
readability and adherence to typesetting conventions.

[1]: https://github.com/git-l10n/git-po/issues/884

Signed-off-by: Jiang Xin <worldhello.net@gmail.com>
5 months agoworktree: clarify that --expire only affects missing worktrees
Sam Bostock [Wed, 28 Jan 2026 05:39:45 +0000 (05:39 +0000)]
worktree: clarify that --expire only affects missing worktrees

The --expire option for "git worktree list" and "git worktree prune"
only affects worktrees whose working directory path no longer exists.
The help text did not make this clear, and the documentation
inconsistently used "unused" for prune but "missing" for list.

Update the help text and documentation to consistently describe these
as "missing worktrees", and use "prune" instead of "expire" when
describing the effect on missing worktrees since the terminology is
clearer.

While at it, expand the description of the "prune" subcommand itself
to better explain what it does and when to use it, as suggested by
Junio.

Helped-by: Eric Sunshine <sunshine@sunshineco.com>
Helped-by: Junio C Hamano <gitster@pobox.com>
Signed-off-by: Sam Bostock <sam@sambostock.ca>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
5 months agol10n: fr: v2.53
Jean-Noël Avila [Fri, 16 Jan 2026 20:14:23 +0000 (21:14 +0100)]
l10n: fr: v2.53

Signed-off-by: Jean-Noël Avila <jn.avila@free.fr>
5 months agol10n: zh_TW.po: update Git 2.53 translation
Yi-Jyun Pan [Wed, 28 Jan 2026 14:45:10 +0000 (22:45 +0800)]
l10n: zh_TW.po: update Git 2.53 translation

Co-authored-by: Lumynous <lumynou5.tw@gmail.com>
Signed-off-by: Yi-Jyun Pan <pan93412@gmail.com>
5 months agoRelNotes: a few spelling fixes
Junio C Hamano [Tue, 27 Jan 2026 20:12:06 +0000 (12:12 -0800)]
RelNotes: a few spelling fixes

Signed-off-by: Junio C Hamano <gitster@pobox.com>
5 months agol10n: tr: Update Turkish translations
Emir SARI [Fri, 16 Jan 2026 16:25:39 +0000 (19:25 +0300)]
l10n: tr: Update Turkish translations

Signed-off-by: Emir SARI <emir_sari@icloud.com>
5 months agol10n: sv.po: Update Swedish translation
Peter Krefting [Tue, 27 Jan 2026 18:33:55 +0000 (19:33 +0100)]
l10n: sv.po: Update Swedish translation

Also fix typos reported by Tuomas Ahola.

Helped-by: Tuomas Ahola <taahol@utu.fi>.
Signed-off-by: Peter Krefting <peter@softwolves.pp.se>
5 months agoGit 2.53-rc2
Junio C Hamano [Tue, 27 Jan 2026 06:26:31 +0000 (22:26 -0800)]
Git 2.53-rc2

Signed-off-by: Junio C Hamano <gitster@pobox.com>
5 months agol10n: po-id for 2.53
Bagas Sanjaya [Tue, 27 Jan 2026 02:11:03 +0000 (09:11 +0700)]
l10n: po-id for 2.53

Update following components:

  * branch.c
  * builtin/blame.c
  * builtin/config.c
  * builtin/fast-export.c
  * builtin/fast-import.c
  * builtin/fetch.c
  * builtin/gc.c
  * builtin/index-pack.c
  * builtin/pack-objects.c
  * builtin/patch-id.c
  * builtin/replay.c
  * builtin/repo.c
  * bundle-uri.c
  * command-list.c
  * object-file.c
  * refs/reftable-backend.c
  * repack-promisor.c
  * strbuf.c

Signed-off-by: Bagas Sanjaya <bagasdotme@gmail.com>
5 months agol10n: ga.po: Fix git-po-helper warnings
Aindriú Mac Giolla Eoin [Mon, 26 Jan 2026 10:26:51 +0000 (10:26 +0000)]
l10n: ga.po: Fix git-po-helper warnings

Signed-off-by: Aindriú Mac Giolla Eoin <aindriu80@gmail.com>
5 months agoRevert "Merge branch 'cs/rebased-subtree-split'"
Junio C Hamano [Sun, 25 Jan 2026 17:43:29 +0000 (09:43 -0800)]
Revert "Merge branch 'cs/rebased-subtree-split'"

This reverts commit 79e3055baba32e2952e6e8994cdcd4fc145ba7f0, reversing
changes made to 9813aace1e52765e01e688672cdcdcbe25336ec7.

Regresison report

    https://lore.kernel.org/git/755578cb-07e0-4b40-aa90-aacf4d45ccaa@heusel.eu/

5 months agofetch: delay user information post committing of transaction
Karthik Nayak [Sun, 25 Jan 2026 22:52:41 +0000 (23:52 +0100)]
fetch: delay user information post committing of transaction

In Git 2.50 and earlier, we would display failure codes and error
message as part of the status display:

  $ git fetch . v1.0.0:refs/heads/foo
    error: cannot update ref 'refs/heads/foo': trying to write non-commit object f665776185ad074b236c00751d666da7d1977dbe to branch 'refs/heads/foo'
    From .
     ! [new tag]               v1.0.0     -> foo  (unable to update local ref)

With the addition of batched updates, this information is no longer
shown to the user:

  $ git fetch . v1.0.0:refs/heads/foo
    From .
     * [new tag]               v1.0.0     -> foo
    error: cannot update ref 'refs/heads/foo': trying to write non-commit object f665776185ad074b236c00751d666da7d1977dbe to branch 'refs/heads/foo'

Since reference updates are batched and processed together at the end,
information around the outcome is not available during individual
reference parsing.

To overcome this, collate and delay the output to the end. Introduce
`ref_update_display_info` which will hold individual update's
information and also whether the update failed or succeeded. This
finally allows us to iterate over all such updates and print them to the
user.

Using an dynamic array and strmap does add some overhead to
'git-fetch(1)', but from benchmarking this seems to be not too bad:

  Benchmark 1: fetch: many refs (refformat = files, refcount = 1000, revision = master)
    Time (mean ± σ):      42.6 ms ±   1.2 ms    [User: 13.1 ms, System: 29.8 ms]
    Range (min … max):    40.1 ms …  45.8 ms    47 runs

  Benchmark 2: fetch: many refs (refformat = files, refcount = 1000, revision = HEAD)
    Time (mean ± σ):      43.1 ms ±   1.2 ms    [User: 12.7 ms, System: 30.7 ms]
    Range (min … max):    40.5 ms …  45.8 ms    48 runs

  Summary
    fetch: many refs (refformat = files, refcount = 1000, revision = master) ran
      1.01 ± 0.04 times faster than fetch: many refs (refformat = files, refcount = 1000, revision = HEAD)

Another approach would be to move the status printing logic to be
handled post the transaction being committed. That however would require
adding an iterator to the ref transaction that tracks both the outcome
(success/failure) and the original refspec information for each update,
which is more involved infrastructure work compared to the strmap
approach here.

Helped-by: Phillip Wood <phillip.wood123@gmail.com>
Reported-by: Jeff King <peff@peff.net>
Signed-off-by: Karthik Nayak <karthik.188@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
5 months agoreceive-pack: utilize rejected ref error details
Karthik Nayak [Sun, 25 Jan 2026 22:52:40 +0000 (23:52 +0100)]
receive-pack: utilize rejected ref error details

In 9d2962a7c4 (receive-pack: use batched reference updates, 2025-05-19),
git-receive-pack(1) switched to using batched reference updates. This also
introduced a regression wherein instead of providing detailed error
messages for failed referenced updates, the users were provided generic
error messages based on the error type.

Now that the updates also contain detailed error message, propagate
those to the client via 'rp_error'. The detailed error messages can be
very verbose, for e.g. in the files backend, when trying to write a
non-commit object to a branch, you would see:

   ! [remote rejected] 3eaec9ccf3a53f168362a6b3fdeb73426fb9813d ->
   branch (cannot update ref 'refs/heads/branch': trying to write
   non-commit object 3eaec9ccf3a53f168362a6b3fdeb73426fb9813d to branch
   'refs/heads/branch')

Here the refname is repeated multiple times due to how error messages
are propagated and filled over the code stack. This potentially can be
cleaned up in a future commit.

Reported-by: Elijah Newren <newren@gmail.com>
Co-authored-by: Jeff King <peff@peff.net>
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Karthik Nayak <karthik.188@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
5 months agofetch: utilize rejected ref error details
Karthik Nayak [Sun, 25 Jan 2026 22:52:39 +0000 (23:52 +0100)]
fetch: utilize rejected ref error details

In 0e358de64a (fetch: use batched reference updates, 2025-05-19),
git-fetch(1) switched to using batched reference updates. This also
introduced a regression wherein instead of providing detailed error
messages for failed referenced updates, the users were provided generic
error messages based on the error type.

Similar to the previous commit, switch to using detailed error messages
if present for failed reference updates to fix this regression.

Reported-by: Elijah Newren <newren@gmail.com>
Co-authored-by: Jeff King <peff@peff.net>
Signed-off-by: Karthik Nayak <karthik.188@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
5 months agoupdate-ref: utilize rejected error details if available
Karthik Nayak [Sun, 25 Jan 2026 22:52:38 +0000 (23:52 +0100)]
update-ref: utilize rejected error details if available

When git-update-ref(1) received the '--update-ref' flag, the error
details generated in the refs namespace wasn't propagated with failed
updates. Instead only an error code pertaining to the type of rejection
was noted.

This missed detailed error message which the user can act upon. The
previous commits added the required code to propagate these detailed
error messages from the refs namespace. Now that additional details are
available, let's output this additional details to stderr. This allows
users to have additional information over the already present machine
parsable output.

While we're here, improve the existing tests for the machine parsable
output by checking for the entire output string and not just the
rejection reason.

Reported-by: Elijah Newren <newren@gmail.com>
Co-authored-by: Jeff King <peff@peff.net>
Signed-off-by: Karthik Nayak <karthik.188@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
5 months agorefs: add rejection detail to the callback function
Karthik Nayak [Sun, 25 Jan 2026 22:52:37 +0000 (23:52 +0100)]
refs: add rejection detail to the callback function

The previous commit started storing the rejection details alongside the
error code for rejected updates. Pass this along to the callback
function `ref_transaction_for_each_rejected_update()`. Currently the
field is unused, but will be integrated in the upcoming commits.

Co-authored-by: Jeff King <peff@peff.net>
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Karthik Nayak <karthik.188@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
5 months agorefs: skip to next ref when current ref is rejected
Karthik Nayak [Sun, 25 Jan 2026 22:52:36 +0000 (23:52 +0100)]
refs: skip to next ref when current ref is rejected

In `refs_verify_refnames_available()` we have two nested loops: the
outer loop iterates over all references to check, while the inner loop
checks for filesystem conflicts for a given ref by breaking down its
path.

With batched updates, when we detect a filesystem conflict, we mark the
update as rejected and execute 'continue'. However, this only skips to
the next iteration of the inner loop, not the outer loop as intended.
This causes the same reference to be repeatedly rejected. Fix this by
using a goto statement to skip to the next reference in the outer loop.

Signed-off-by: Karthik Nayak <karthik.188@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
5 months agoMerge branch 'master' of https://github.com/j6t/git-gui
Junio C Hamano [Sun, 25 Jan 2026 17:08:06 +0000 (09:08 -0800)]
Merge branch 'master' of https://github.com/j6t/git-gui

* 'master' of https://github.com/j6t/git-gui:
  git-gui: mark *.po files at any directory level as UTF-8
  git-gui i18n: Update Bulgarian translation (558t)
  git-gui i18n: Update Bulgarian translation (557t)

5 months agol10n: bg.po: Updated Bulgarian translation (6091t)
Alexander Shopov [Sat, 17 Jan 2026 09:02:06 +0000 (10:02 +0100)]
l10n: bg.po: Updated Bulgarian translation (6091t)

Signed-off-by: Alexander Shopov <ash@kambanaria.org>
5 months agogit-gui: mark *.po files at any directory level as UTF-8
Johannes Sixt [Sun, 25 Jan 2026 09:46:23 +0000 (10:46 +0100)]
git-gui: mark *.po files at any directory level as UTF-8

When a commit is viewed in Gitk that changes a file in po/glossary, the
patch text shows mojibake instead of correctly decoded UTF-8 text.
Gitk retrieves the encoding attribute to decide how to treat the bytes
that make up the patch text. There is an attribute definition that all
files are US-ASCII, and a later attribute definition overrides this.
But the override, which specifies UTF-8, applies only to *.po files in
directory po/ and does not apply to subdirectories.

Widen the pattern to apply to all directory levels.

Signed-off-by: Johannes Sixt <j6t@kdbg.org>
5 months agoMerge branch 'master' of github.com:alshopov/git-gui
Johannes Sixt [Sun, 25 Jan 2026 09:32:21 +0000 (10:32 +0100)]
Merge branch 'master' of github.com:alshopov/git-gui

* 'master' of github.com:alshopov/git-gui:
  git-gui i18n: Update Bulgarian translation (558t)

5 months agogit-gui i18n: Update Bulgarian translation (558t)
Alexander Shopov [Mon, 19 Jan 2026 09:13:14 +0000 (10:13 +0100)]
git-gui i18n: Update Bulgarian translation (558t)

- Translate new string (558t)
- Add graves for disambiguation
- Improve glossary translation (96t) and synchonize with git

Signed-off-by: Alexander Shopov <ash@kambanaria.org>
5 months agoMerge branch 'master' of github.com:alshopov/git-gui
Johannes Sixt [Sat, 24 Jan 2026 08:25:29 +0000 (09:25 +0100)]
Merge branch 'master' of github.com:alshopov/git-gui

* 'master' of github.com:alshopov/git-gui:
  git-gui i18n: Update Bulgarian translation (557t)

Signed-off-by: Johannes Sixt <j6t@kdbg.org>
5 months agoA bit more before -rc2
Junio C Hamano [Fri, 23 Jan 2026 21:34:17 +0000 (13:34 -0800)]
A bit more before -rc2

Signed-off-by: Junio C Hamano <gitster@pobox.com>
5 months agoMerge branch 'dk/replay-doc-omit-irrelevant-rev-list-options'
Junio C Hamano [Fri, 23 Jan 2026 21:34:37 +0000 (13:34 -0800)]
Merge branch 'dk/replay-doc-omit-irrelevant-rev-list-options'

Documentation clean-up.

* dk/replay-doc-omit-irrelevant-rev-list-options:
  lint-gitlink: preemptively ignore all /ifn?def|endif/ macros
  replay: drop rev-list formatting options from manual

5 months agoMerge branch 'js/symlink-windows'
Junio C Hamano [Fri, 23 Jan 2026 21:34:36 +0000 (13:34 -0800)]
Merge branch 'js/symlink-windows'

Upstream symbolic link support on Windows from Git-for-Windows.

* js/symlink-windows:
  mingw: special-case index entries for symlinks with buggy size
  mingw: emulate `stat()` a little more faithfully
  mingw: try to create symlinks without elevated permissions
  mingw: add support for symlinks to directories
  mingw: implement basic `symlink()` functionality (file symlinks only)
  mingw: implement `readlink()`
  mingw: allow `mingw_chdir()` to change to symlink-resolved directories
  mingw: support renaming symlinks
  mingw: handle symlinks to directories in `mingw_unlink()`
  mingw: add symlink-specific error codes
  mingw: change default of `core.symlinks` to false
  mingw: factor out the retry logic
  mingw: compute the correct size for symlinks in `mingw_lstat()`
  mingw: teach dirent about symlinks
  mingw: let `mingw_lstat()` error early upon problems with reparse points
  mingw: drop the separate `do_lstat()` function
  mingw: implement `stat()` with symlink support
  mingw: don't call `GetFileAttributes()` twice in `mingw_lstat()`

5 months agoMerge branch 'pw/mailmap-self'
Junio C Hamano [Fri, 23 Jan 2026 21:34:36 +0000 (13:34 -0800)]
Merge branch 'pw/mailmap-self'

Unify entries in .mailmap file for Phillip Wood.

* pw/mailmap-self:
  mailmap: add an entry for Phillip Wood

5 months agoMerge branch 'js/ci-leak-skip-svn'
Junio C Hamano [Fri, 23 Jan 2026 21:34:36 +0000 (13:34 -0800)]
Merge branch 'js/ci-leak-skip-svn'

Dscho observed that SVN tests are taking too much time in CI leak
checking tasks, but most time is spent not in our code but in libsvn
code (which happen to be written in Perl), whose leaks have little
value to discover for us.  Skip SVN, P4, and CVS tests in the leak
checking tasks.

* js/ci-leak-skip-svn:
  ci: skip CVS and P4 tests in leaks job, too
  ci(*-leaks): skip the git-svn tests to save time

5 months agoMerge branch 'jx/build-options-gettext'
Junio C Hamano [Fri, 23 Jan 2026 21:34:36 +0000 (13:34 -0800)]
Merge branch 'jx/build-options-gettext'

"git bugreport" and "git version --build-options" learned to
include use of 'gettext' feature, to make it easier to diagnose
problems around l10n.

* jx/build-options-gettext:
  help: report on whether or not gettext is enabled

5 months agoMerge branch 'ty/t1005-test-path-is-helpers'
Junio C Hamano [Fri, 23 Jan 2026 21:34:36 +0000 (13:34 -0800)]
Merge branch 'ty/t1005-test-path-is-helpers'

Test clean-up.

* ty/t1005-test-path-is-helpers:
  t1005: modernize "! test -f" to "test_path_is_missing"

5 months agoMerge branch 'rj/cygwin-test-fixes-for-2.53'
Junio C Hamano [Fri, 23 Jan 2026 21:34:35 +0000 (13:34 -0800)]
Merge branch 'rj/cygwin-test-fixes-for-2.53'

Test fixup.

* rj/cygwin-test-fixes-for-2.53:
  t0610-reftable-basics: mitigate a flaky test on cygwin
  t9700/test.pl: fix path type expectation on cygwin

5 months agoMerge branch 'sb/doc-update-ref-markup-fix'
Junio C Hamano [Fri, 23 Jan 2026 21:34:35 +0000 (13:34 -0800)]
Merge branch 'sb/doc-update-ref-markup-fix'

Doc mark-up fix.

* sb/doc-update-ref-markup-fix:
  doc: fix `update-ref` `symref-create` formatting

5 months agoMerge branch 'kh/mailmap-avila'
Junio C Hamano [Fri, 23 Jan 2026 21:34:35 +0000 (13:34 -0800)]
Merge branch 'kh/mailmap-avila'

* kh/mailmap-avila:
  .mailmap: fix and expand mappings for Jean-Noël Avila

5 months agol10n: ga.po: Update Irish translation for Git 2.53
Aindriú Mac Giolla Eoin [Fri, 23 Jan 2026 11:54:09 +0000 (11:54 +0000)]
l10n: ga.po: Update Irish translation for Git 2.53

Signed-off-by: Aindriú Mac Giolla Eoin <aindriu80@gmail.com>
5 months agogit-gui i18n: Update Bulgarian translation (557t)
Alexander Shopov [Mon, 19 Jan 2026 09:13:14 +0000 (10:13 +0100)]
git-gui i18n: Update Bulgarian translation (557t)

Fix the meaning of a string

Signed-off-by: Alexander Shopov <ash@kambanaria.org>
5 months agoA few on top of -rc1
Junio C Hamano [Wed, 21 Jan 2026 21:58:08 +0000 (13:58 -0800)]
A few on top of -rc1

Signed-off-by: Junio C Hamano <gitster@pobox.com>
5 months agoMerge branch 'rs/tree-wo-the-repository'
Junio C Hamano [Thu, 22 Jan 2026 00:16:28 +0000 (16:16 -0800)]
Merge branch 'rs/tree-wo-the-repository'

Remove implicit reliance on the_repository global in the APIs
around tree objects and make it explicit which repository to work
in.

* rs/tree-wo-the-repository:
  cocci: remove obsolete the_repository rules
  cocci: convert parse_tree functions to repo_ variants
  tree: stop using the_repository
  tree: use repo_parse_tree()
  path-walk: use repo_parse_tree_gently()
  pack-bitmap-write: use repo_parse_tree()
  delta-islands: use repo_parse_tree()
  bloom: use repo_parse_tree()
  add-interactive: use repo_parse_tree_indirect()
  tree: add repo_parse_tree*()
  environment: move access to core.maxTreeDepth into repo settings

5 months agoMerge branch 'ps/config-doc-get-urlmatch-fix'
Junio C Hamano [Thu, 22 Jan 2026 00:16:27 +0000 (16:16 -0800)]
Merge branch 'ps/config-doc-get-urlmatch-fix'

Docfix.

* ps/config-doc-get-urlmatch-fix:
  Documentation/config: fix replacement for --get-urlmatch

5 months agoMerge branch 'tb/midx-write-corrupt-checksum-fix'
Junio C Hamano [Thu, 22 Jan 2026 00:16:27 +0000 (16:16 -0800)]
Merge branch 'tb/midx-write-corrupt-checksum-fix'

The logic that avoids reusing MIDX files with a wrong checksum was
broken, which has been corrected.

* tb/midx-write-corrupt-checksum-fix:
  midx-write.c: assume checksum-invalid MIDXs require an update
  t/t5319-multi-pack-index.sh: drop early 'test_done'

5 months agoMerge branch 'ps/geometric-repacking-with-promisor-remotes'
Junio C Hamano [Thu, 22 Jan 2026 00:16:27 +0000 (16:16 -0800)]
Merge branch 'ps/geometric-repacking-with-promisor-remotes'

"git repack --geometric" did not work with promisor packs, which
has been corrected.

* ps/geometric-repacking-with-promisor-remotes:
  builtin/repack: handle promisor packs with geometric repacking
  repack-promisor: extract function to remove redundant packs
  repack-promisor: extract function to finalize repacking
  repack-geometry: extract function to compute repacking split
  builtin/pack-objects: exclude promisor objects with "--stdin-packs"

5 months ago.mailmap: fix and expand mappings for Jean-Noël Avila
Kristoffer Haugsbakk [Wed, 21 Jan 2026 21:51:09 +0000 (22:51 +0100)]
.mailmap: fix and expand mappings for Jean-Noël Avila

The latest release candidate notes say that there is a new contributor:

    Jean-Noël Avila via GitGitGadget, ...

But this is a familiar face, just in a G.G. Gadget trench coat.

Also map the rest of the idents in the history.

Signed-off-by: Kristoffer Haugsbakk <code@khaugsbakk.name>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
5 months agot5500: simplify test implementation and fix git exit code suppression
Shreyansh Paliwal [Wed, 21 Jan 2026 12:54:11 +0000 (18:24 +0530)]
t5500: simplify test implementation and fix git exit code suppression

The 'shallow since with commit graph and already-seen commit”
test uses a convoluted here-doc that combines manual input
construction with packetize, echo and embedded Git commands.
This structure hides failures from the git commands,
as their exit codes are suppressed inside echo command
substitution and being on the upstream side of pipes.

Instead of using here-doc to construct the pack
protocol that is directly sent to the
'git upload-pack' command being tested,
capture the outputs of the git commands upfront
and use the 'test-tool pkt-line pack'
tool to construct the input in a temporary file,
and then feed it to the command.

This has a few advantages:

* Executing the git commands outside the here-doc
avoids suppressing their exit codes and makes
debugging easier.

* It removes the need to manually count and
manage pkt-line lengths to keep in line with
the v2 protocol, as the tool handles this internally.

Signed-off-by: Shreyansh Paliwal <shreyanshpaliwalcmsmn@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
5 months agosparse-checkout: optimize string_list construction and add tests to verify deduplication.
Amisha Chhajed [Wed, 21 Jan 2026 13:00:05 +0000 (18:30 +0530)]
sparse-checkout: optimize string_list construction and add tests to verify deduplication.

Improve O(n^2) complexity to O(n log n) while building a sorted
'string_list' by constructing it unsorted then sorting it
followed by removing duplicates.

sparse-checkout deduplicates repeated cone-mode patterns,
but this behaviour was previously untested, add tests that
verify that sparse-checkout file contain each cone
pattern only once and sparse-checkout list reports each pattern
only once.

Signed-off-by: Amisha Chhajed <amishhhaaaa@gmail.com>
Acked-by: Derrick Stolee <stolee@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
5 months agoGit 2.53-rc1
Junio C Hamano [Tue, 20 Jan 2026 23:22:31 +0000 (15:22 -0800)]
Git 2.53-rc1

Signed-off-by: Junio C Hamano <gitster@pobox.com>
5 months agoMerge branch 'js/prep-symlink-windows'
Junio C Hamano [Wed, 21 Jan 2026 16:29:00 +0000 (08:29 -0800)]
Merge branch 'js/prep-symlink-windows'

Further preparation to upstream symbolic link support on Windows.

* js/prep-symlink-windows:
  trim_last_path_component(): avoid hard-coding the directory separator
  strbuf_readlink(): support link targets that exceed 2*PATH_MAX
  strbuf_readlink(): avoid calling `readlink()` twice in corner-cases
  init: do parse _all_ core.* settings early
  mingw: do resolve symlinks in `getcwd()`

5 months agoMerge branch 'ps/read-object-info-improvements'
Junio C Hamano [Wed, 21 Jan 2026 16:29:00 +0000 (08:29 -0800)]
Merge branch 'ps/read-object-info-improvements'

The object-info API has been cleaned up.

* ps/read-object-info-improvements:
  packfile: drop repository parameter from `packed_object_info()`
  packfile: skip unpacking object header for disk size requests
  packfile: disentangle return value of `packed_object_info()`
  packfile: always populate pack-specific info when reading object info
  packfile: extend `is_delta` field to allow for "unknown" state
  packfile: always declare object info to be OI_PACKED
  object-file: always set OI_LOOSE when reading object info

5 months agoMerge branch 'ps/packfile-store-in-odb-source'
Junio C Hamano [Wed, 21 Jan 2026 16:28:58 +0000 (08:28 -0800)]
Merge branch 'ps/packfile-store-in-odb-source'

The packfile_store data structure is moved from object store to odb
source.

* ps/packfile-store-in-odb-source:
  packfile: move MIDX into packfile store
  packfile: refactor `find_pack_entry()` to work on the packfile store
  packfile: inline `find_kept_pack_entry()`
  packfile: only prepare owning store in `packfile_store_prepare()`
  packfile: only prepare owning store in `packfile_store_get_packs()`
  packfile: move packfile store into object source
  packfile: refactor misleading code when unusing pack windows
  packfile: refactor kept-pack cache to work with packfile stores
  packfile: pass source to `prepare_pack()`
  packfile: create store via its owning source

5 months agoMerge branch 'kt/http-backend-errors'
Junio C Hamano [Wed, 21 Jan 2026 16:28:58 +0000 (08:28 -0800)]
Merge branch 'kt/http-backend-errors'

Some error messages from the http transport layer lacked the
terminating newline, which has been corrected.

* kt/http-backend-errors:
  http-backend: write newlines to stderr when responding with errors

5 months agoMerge branch 'ps/t1410-cleanup'
Junio C Hamano [Wed, 21 Jan 2026 16:28:58 +0000 (08:28 -0800)]
Merge branch 'ps/t1410-cleanup'

Test clean-up.

* ps/t1410-cleanup:
  t1410: use test helpers in reflog rewind test

5 months agoMerge branch 'ps/ref-consistency-checks'
Junio C Hamano [Wed, 21 Jan 2026 16:28:58 +0000 (08:28 -0800)]
Merge branch 'ps/ref-consistency-checks'

Update code paths that check data integrity around refs subsystem.
cf. <CAOLa=ZShPP3BPXa=YnC-vuX4zF=pUTFdUidZwOdna8bfVTNM9w@mail.gmail.com>

* ps/ref-consistency-checks:
  builtin/fsck: drop `fsck_head_link()`
  builtin/fsck: move generic HEAD check into `refs_fsck()`
  builtin/fsck: move generic object ID checks into `refs_fsck()`
  refs/reftable: introduce generic checks for refs
  refs/reftable: fix consistency checks with worktrees
  refs/reftable: extract function to retrieve backend for worktree
  refs/reftable: adapt includes to become consistent
  refs/files: introduce function to perform normal ref checks
  refs/files: extract generic symref target checks
  fsck: drop unused fields from `struct fsck_ref_report`
  refs/files: perform consistency checks for root refs
  refs/files: improve error handling when verifying symrefs
  refs/files: extract function to check single ref
  refs/files: remove useless indirection
  refs/files: remove `refs_check_dir` parameter
  refs/files: move fsck functions into global scope
  refs/files: simplify iterating through root refs

5 months agoMerge branch 'tb/macos-iconv-workarounds'
Junio C Hamano [Wed, 21 Jan 2026 16:28:57 +0000 (08:28 -0800)]
Merge branch 'tb/macos-iconv-workarounds'

The iconv library on macOS fails to correctly handle stateful
ISO/IEC 2022 encoded strings.  Work it around instead of replacing
it wholesale from homebrew.

* tb/macos-iconv-workarounds:
  utf8.c: enable workaround for iconv under macOS 14/15
  utf8.c: prepare workaround for iconv under macOS 14/15

5 months agoMerge branch 'cs/rebased-subtree-split'
Junio C Hamano [Wed, 21 Jan 2026 16:28:57 +0000 (08:28 -0800)]
Merge branch 'cs/rebased-subtree-split'

The split command in "git subtree" (in contrib/) has been taught to
deal better with rebased history.

* cs/rebased-subtree-split:
  contrib/subtree: detect rewritten subtree commits

5 months agoMerge branch 'je/doc-reset'
Junio C Hamano [Wed, 21 Jan 2026 16:28:57 +0000 (08:28 -0800)]
Merge branch 'je/doc-reset'

Documentation updates.

* je/doc-reset:
  doc: git-reset: clarify `git reset <pathspec>`
  doc: git-reset: clarify `git reset [mode]`
  doc: git-reset: clarify intro
  doc: git-reset: reorder the forms

5 months agoMerge branch 'en/fsck-snapshot-ref-state'
Junio C Hamano [Wed, 21 Jan 2026 16:28:57 +0000 (08:28 -0800)]
Merge branch 'en/fsck-snapshot-ref-state'

"git fsck" used inconsistent set of refs to show a confused
warning, which has been corrected.

* en/fsck-snapshot-ref-state:
  fsck: snapshot default refs before object walk

5 months agolint-gitlink: preemptively ignore all /ifn?def|endif/ macros
Jean-Noël Avila [Wed, 21 Jan 2026 13:27:05 +0000 (14:27 +0100)]
lint-gitlink: preemptively ignore all /ifn?def|endif/ macros

Instead of testing if the macro name is ifn?def:: as if it were a inline
macro, it is faster and safer to just ignore such block macro lines before
hand.

Signed-off-by: Jean-Noël Avila <jn.avila@free.fr>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
5 months agolast-modified: change default max-depth to 0
Toon Claes [Tue, 20 Jan 2026 21:47:11 +0000 (22:47 +0100)]
last-modified: change default max-depth to 0

By default git-last-modified(1) doesn't recurse into subtrees. So when
the pathspec contained a path in a subtree, the command would only print
the commit information about the parent tree of the path, like:

    $ git last-modified -- path/file
    aaa0aab1bbb2bcc3ccc4ddd5dde6eee7eff8fff9 path

Change the default behavior to give commit information about the exact
path instead:

    $ git last-modified -- path/file
    aaa0aab1bbb2bcc3ccc4ddd5dde6eee7eff8fff9 path/file

To achieve this, the default max-depth is changed to 0 and recursive is
always enabled.

The handling of option '-r' is modified to disable a max-depth,
resulting in the behavior of this option to remain unchanged.

No existing tests were modified, because there didn't exist any tests
covering the example above. But more tests are added to cover this now.

Signed-off-by: Toon Claes <toon@iotcl.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>