Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
41 commits
Select commit Hold shift + click to select a range
b2faaae
graph: limit the graph width to a hard-coded max
pabloosabaterr Mar 28, 2026
f756a3c
graph: add --graph-lane-limit option
pabloosabaterr Mar 28, 2026
9bab3ce
graph: add truncation mark to capped lanes
pabloosabaterr Mar 28, 2026
7cce609
t9210, t9211: disable GIT_TEST_SPLIT_INDEX for scalar clone tests
ptarjan Apr 15, 2026
e21be6c
fsmonitor: fix khash memory leak in do_handle_client
ptarjan Apr 15, 2026
8b1d965
fsmonitor: fix hashmap memory leak in fsmonitor_run_daemon
ptarjan Apr 15, 2026
8372c88
compat/win32: add pthread_cond_timedwait
ptarjan Apr 15, 2026
56cef9c
fsmonitor: use pthread_cond_timedwait for cookie wait
ptarjan Apr 15, 2026
ff384eb
fsmonitor: rename fsm-ipc-darwin.c to fsm-ipc-unix.c
ptarjan Apr 15, 2026
7422200
fsmonitor: rename fsm-settings-darwin.c to fsm-settings-unix.c
ptarjan Apr 15, 2026
ce48de8
fsmonitor: implement filesystem change listener for Linux
ptarjan Apr 15, 2026
50dc89c
run-command: add close_fd_above_stderr option
ptarjan Apr 15, 2026
9266aaf
fsmonitor: close inherited file descriptors and detach in daemon
ptarjan Apr 15, 2026
1cbfa62
fsmonitor: add timeout to daemon stop command
ptarjan Apr 15, 2026
d21fc23
fsmonitor: add tests for Linux
ptarjan Apr 15, 2026
b1cebd7
fsmonitor: convert shown khash to strset in do_handle_client
ptarjan Apr 15, 2026
6da647d
cat-file: add mailmap subcommand to --batch-command
edith007 Apr 16, 2026
99ac232
bisect: use selected alternate terms in status output
May 14, 2026
0c0f93e
bisect: print bisect terms in single quotes
May 14, 2026
cb55991
rev-parse: use selected alternate terms to look up refs
May 14, 2026
d9982e8
connected: close err_fd in promisor fast-path
ethanndickson May 15, 2026
1740cc3
Merge branch 'ed/check-connected-close-err-fd-2.53' into ed/check-con…
gitster May 16, 2026
088d9a1
generate-configlist: collapse depfile for older Ninja
To1ne May 15, 2026
b80b462
commit-reach: use object flags for tips_reachable_from_bases()
spkrka May 16, 2026
a30f132
t6600: add tests for duplicate tips in tips_reachable_from_bases()
spkrka May 16, 2026
3d8e400
commit: fall back to full read when maybe_tree is NULL
peff May 19, 2026
f4d7eb3
Documentation/git-range-diff: add missing notes options in synopsis
siddhpant May 21, 2026
c9d708b
gitlab-ci: upgrade macOS runners
pks-t May 21, 2026
62319b4
gitlab-ci: update macOS image
pks-t May 21, 2026
e9068a5
Merge branch 'ed/check-connected-close-err-fd-2.53'
gitster May 31, 2026
e6a641e
Merge branch 'ed/check-connected-close-err-fd'
gitster May 31, 2026
a0ce168
Merge branch 'kk/tips-reachable-from-bases-optim'
gitster May 31, 2026
1694d2b
Merge branch 'tc/generate-configlist-fix-for-older-ninja'
gitster May 31, 2026
d2c0131
Merge branch 'jr/bisect-custom-terms-in-output'
gitster May 31, 2026
7af2503
Merge branch 'ps/graph-lane-limit'
gitster May 31, 2026
4d11b9c
Merge branch 'pt/fsmonitor-linux'
gitster May 31, 2026
f6c8fe1
Merge branch 'jk/commit-graph-lazy-load-fallback'
gitster May 31, 2026
33da2f4
Merge branch 'sa/cat-file-batch-mailmap-switch'
gitster May 31, 2026
a096b19
Merge branch 'ps/gitlab-ci-macOS-improvements'
gitster May 31, 2026
25d6fff
Merge branch 'sp/doc-range-diff-takes-notes'
gitster May 31, 2026
1666c12
The 10th batch
gitster May 31, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions .gitlab-ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ test:osx:
stage: test
needs: [ ]
tags:
- saas-macos-medium-m1
- saas-macos-large-m2pro
variables:
TEST_OUTPUT_DIRECTORY: "/Volumes/RAMDisk"
before_script:
Expand All @@ -104,10 +104,10 @@ test:osx:
image: macos-15-xcode-16
CC: clang
- jobname: osx-reftable
image: macos-15-xcode-16
image: macos-26-xcode-26
CC: clang
- jobname: osx-meson
image: macos-15-xcode-16
image: macos-26-xcode-26
CC: clang
artifacts:
paths:
Expand Down
27 changes: 27 additions & 0 deletions Documentation/RelNotes/2.55.0.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,15 @@ UI, Workflows & Features
* The command line parser for "git diff" learned a few options take
only non-negative integers.

* The graph output from commands like "git log --graph" can now be
limited to a specified number of lanes, preventing overly wide output
in repositories with many branches.

* The fsmonitor daemon has been implemented for Linux.

* "git cat-file --batch" learns an in-line command "mailmap"
that lets the user toggle use of mailmap.


Performance, Internal Implementation, Development Support etc.
--------------------------------------------------------------
Expand Down Expand Up @@ -98,6 +107,14 @@ Performance, Internal Implementation, Development Support etc.
* Many uses of the_repository has been updated to use a more
appropriate struct repository instance in setup.c codepath.

* Revision traversal optimization.

* Build update.

* The logic to lazy-load trees from the commit-graph has been made
more robust by falling back to reading the commit object when
the commit-graph is no longer available.


Fixes since v2.54
-----------------
Expand Down Expand Up @@ -206,6 +223,13 @@ Fixes since v2.54
(i.e., "https://example.com" not "https://example.com/").
(merge b92387cd55 jk/dumb-http-alternate-fix later to maint).

* "git bisect" now uses the selected terms (e.g., old/new) more
consistently in its output.
(merge cb55991825 jr/bisect-custom-terms-in-output later to maint).

* Update GitLab CI jobs that exercise macOS.
(merge 62319b49bb ps/gitlab-ci-macOS-improvements later to maint).

* Other code cleanup, docfix, build fix, etc.
(merge 80f4b802e9 ja/doc-difftool-synopsis-style later to maint).
(merge b96490241e jc/doc-timestamps-in-stat later to maint).
Expand All @@ -224,3 +248,6 @@ Fixes since v2.54
(merge 499f9048e0 ps/t3903-cover-stash-include-untracked later to maint).
(merge b56ab270aa jk/sq-dequote-cleanup later to maint).
(merge 29d9fdcf10 rs/use-builtin-add-overflow-explicitly-on-clang later to maint).
(merge d9982e8290 ed/check-connected-close-err-fd-2.53 later to maint).
(merge 1740cc35d0 ed/check-connected-close-err-fd later to maint).
(merge f4d7eb3d1c sp/doc-range-diff-takes-notes later to maint).
4 changes: 2 additions & 2 deletions Documentation/config/fsmonitor--daemon.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@ fsmonitor.allowRemote::
behavior. Only respected when `core.fsmonitor` is set to `true`.

fsmonitor.socketDir::
This Mac OS-specific option, if set, specifies the directory in
This Mac OS and Linux-specific option, if set, specifies the directory in
which to create the Unix domain socket used for communication
between the fsmonitor daemon and various Git commands. The directory must
reside on a native Mac OS filesystem. Only respected when `core.fsmonitor`
reside on a native filesystem. Only respected when `core.fsmonitor`
is set to `true`.
5 changes: 5 additions & 0 deletions Documentation/git-cat-file.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -174,6 +174,11 @@ flush::
since the beginning or since the last flush was issued. When `--buffer`
is used, no output will come until a `flush` is issued. When `--buffer`
is not used, commands are flushed each time without issuing `flush`.

`mailmap (<bool>)`::
Enable or disable mailmap for subsequent commands. The `<bool>`
argument accepts the same boolean values as linkgit:git-config[1].
The mailmap data is read upon the first use and only once.
--
+

Expand Down
28 changes: 24 additions & 4 deletions Documentation/git-fsmonitor--daemon.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -76,9 +76,9 @@ repositories; this may be overridden by setting `fsmonitor.allowRemote` to
correctly with all network-mounted repositories, so such use is considered
experimental.

On Mac OS, the inter-process communication (IPC) between various Git
On Mac OS and Linux, the inter-process communication (IPC) between various Git
commands and the fsmonitor daemon is done via a Unix domain socket (UDS) -- a
special type of file -- which is supported by native Mac OS filesystems,
special type of file -- which is supported by native Mac OS and Linux filesystems,
but not on network-mounted filesystems, NTFS, or FAT32. Other filesystems
may or may not have the needed support; the fsmonitor daemon is not guaranteed
to work with these filesystems and such use is considered experimental.
Expand All @@ -87,13 +87,33 @@ By default, the socket is created in the `.git` directory. However, if the
`.git` directory is on a network-mounted filesystem, it will instead be
created at `$HOME/.git-fsmonitor-*` unless `$HOME` itself is on a
network-mounted filesystem, in which case you must set the configuration
variable `fsmonitor.socketDir` to the path of a directory on a Mac OS native
variable `fsmonitor.socketDir` to the path of a directory on a native
filesystem in which to create the socket file.

If none of the above directories (`.git`, `$HOME`, or `fsmonitor.socketDir`)
is on a native Mac OS file filesystem the fsmonitor daemon will report an
is on a native filesystem the fsmonitor daemon will report an
error that will cause the daemon and the currently running command to exit.

LINUX CAVEATS
~~~~~~~~~~~~~

On Linux, the fsmonitor daemon uses inotify to monitor filesystem events.
The inotify system has per-user limits on the number of watches that can
be created. The default limit is typically 8192 watches per user.

For large repositories with many directories, you may need to increase
this limit. Check the current limit with:

cat /proc/sys/fs/inotify/max_user_watches

To temporarily increase the limit:

sudo sysctl fs.inotify.max_user_watches=65536

To make the change permanent, add to `/etc/sysctl.conf`:

fs.inotify.max_user_watches=65536

CONFIGURATION
-------------

Expand Down
2 changes: 1 addition & 1 deletion Documentation/git-range-diff.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ SYNOPSIS
git range-diff [--color=[<when>]] [--no-color] [<diff-options>]
[--no-dual-color] [--creation-factor=<factor>]
[--left-only | --right-only] [--diff-merges=<format>]
[--remerge-diff]
[--remerge-diff] [--no-notes | --notes[=<ref>]]
( <range1> <range2> | <rev1>...<rev2> | <base> <rev1> <rev2> )
[[--] <path>...]

Expand Down
6 changes: 6 additions & 0 deletions Documentation/rev-list-options.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -1259,6 +1259,12 @@ This implies the `--topo-order` option by default, but the
in between them in that case. If _<barrier>_ is specified, it
is the string that will be shown instead of the default one.

`--graph-lane-limit=<n>`::
When `--graph` is used, limit the number of graph lanes to be shown.
Lanes over the limit are replaced with a truncation mark '~'.
By default it is set to 0 (no limit), zero and negative values
are ignored and treated as no limit.

ifdef::git-rev-list[]
`--count`::
Print a number stating how many commits would have been
Expand Down
6 changes: 3 additions & 3 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -416,7 +416,7 @@ include shared.mak
# If your platform has OS-specific ways to tell if a repo is incompatible with
# fsmonitor (whether the hook or IPC daemon version), set FSMONITOR_OS_SETTINGS
# to the "<name>" of the corresponding `compat/fsmonitor/fsm-settings-<name>.c`
# that implements the `fsm_os_settings__*()` routines.
# and `compat/fsmonitor/fsm-ipc-<name>.c` files.
#
# Define LINK_FUZZ_PROGRAMS if you want `make all` to also build the fuzz test
# programs in oss-fuzz/.
Expand Down Expand Up @@ -2374,13 +2374,13 @@ ifdef FSMONITOR_DAEMON_BACKEND
COMPAT_CFLAGS += -DHAVE_FSMONITOR_DAEMON_BACKEND
COMPAT_OBJS += compat/fsmonitor/fsm-listen-$(FSMONITOR_DAEMON_BACKEND).o
COMPAT_OBJS += compat/fsmonitor/fsm-health-$(FSMONITOR_DAEMON_BACKEND).o
COMPAT_OBJS += compat/fsmonitor/fsm-ipc-$(FSMONITOR_DAEMON_BACKEND).o
endif

ifdef FSMONITOR_OS_SETTINGS
COMPAT_CFLAGS += -DHAVE_FSMONITOR_OS_SETTINGS
COMPAT_OBJS += compat/fsmonitor/fsm-ipc-$(FSMONITOR_OS_SETTINGS).o
COMPAT_OBJS += compat/fsmonitor/fsm-settings-$(FSMONITOR_OS_SETTINGS).o
COMPAT_OBJS += compat/fsmonitor/fsm-path-utils-$(FSMONITOR_OS_SETTINGS).o
COMPAT_OBJS += compat/fsmonitor/fsm-path-utils-$(FSMONITOR_DAEMON_BACKEND).o
endif

ifdef WITH_BREAKING_CHANGES
Expand Down
16 changes: 8 additions & 8 deletions bisect.c
Original file line number Diff line number Diff line change
Expand Up @@ -711,7 +711,7 @@ static enum bisect_error error_if_skipped_commits(struct commit_list *tried,
return BISECT_OK;

printf("There are only 'skip'ped commits left to test.\n"
"The first %s commit could be any of:\n", term_bad);
"The first '%s' commit could be any of:\n", term_bad);

for ( ; tried; tried = tried->next)
printf("%s\n", oid_to_hex(&tried->item->object.oid));
Expand Down Expand Up @@ -810,7 +810,7 @@ static enum bisect_error handle_bad_merge_base(void)
"between %s and [%s].\n"),
bad_hex, bad_hex, good_hex);
} else {
fprintf(stderr, _("The merge base %s is %s.\n"
fprintf(stderr, _("The merge base %s is '%s'.\n"
"This means the first '%s' commit is "
"between %s and [%s].\n"),
bad_hex, term_bad, term_good, bad_hex, good_hex);
Expand All @@ -820,9 +820,9 @@ static enum bisect_error handle_bad_merge_base(void)
return BISECT_MERGE_BASE_CHECK;
}

fprintf(stderr, _("Some %s revs are not ancestors of the %s rev.\n"
fprintf(stderr, _("Some '%s' revs are not ancestors of the '%s' rev.\n"
"git bisect cannot work properly in this case.\n"
"Maybe you mistook %s and %s revs?\n"),
"Maybe you mistook '%s' and '%s' revs?\n"),
term_good, term_bad, term_good, term_bad);
return BISECT_FAILED;
}
Expand All @@ -835,7 +835,7 @@ static void handle_skipped_merge_base(const struct object_id *mb)

warning(_("the merge base between %s and [%s] "
"must be skipped.\n"
"So we cannot be sure the first %s commit is "
"So we cannot be sure the first '%s' commit is "
"between %s and %s.\n"
"We continue anyway."),
bad_hex, good_hex, term_bad, mb_hex, bad_hex);
Expand Down Expand Up @@ -928,7 +928,7 @@ static enum bisect_error check_good_are_ancestors_of_bad(struct repository *r,
struct commit **rev;

if (!current_bad_oid)
return error(_("a %s revision is needed"), term_bad);
return error(_("a '%s' revision is needed"), term_bad);

filename = repo_git_path(the_repository, "BISECT_ANCESTORS_OK");

Expand Down Expand Up @@ -1090,7 +1090,7 @@ enum bisect_error bisect_next_all(struct repository *r, const char *prefix)
res = error_if_skipped_commits(tried, NULL);
if (res < 0)
goto cleanup;
printf(_("%s was both %s and %s\n"),
printf(_("%s was both '%s' and '%s'\n"),
oid_to_hex(current_bad_oid),
term_good,
term_bad);
Expand All @@ -1113,7 +1113,7 @@ enum bisect_error bisect_next_all(struct repository *r, const char *prefix)
res = error_if_skipped_commits(tried, current_bad_oid);
if (res)
goto cleanup;
printf("%s is the first %s commit\n", oid_to_hex(bisect_rev),
printf("%s is the first '%s' commit\n", oid_to_hex(bisect_rev),
term_bad);

show_commit(revs.commits->item);
Expand Down
31 changes: 17 additions & 14 deletions builtin/bisect.c
Original file line number Diff line number Diff line change
Expand Up @@ -465,13 +465,16 @@ static void bisect_print_status(const struct bisect_terms *terms)
return;

if (!state.nr_good && !state.nr_bad)
bisect_log_printf(_("status: waiting for both good and bad commits\n"));
bisect_log_printf(_("status: waiting for both '%s' and '%s' commits\n"),
terms->term_good, terms->term_bad);
else if (state.nr_good)
bisect_log_printf(Q_("status: waiting for bad commit, %d good commit known\n",
"status: waiting for bad commit, %d good commits known\n",
state.nr_good), state.nr_good);
bisect_log_printf(Q_("status: waiting for '%s' commit, %d '%s' commit known\n",
"status: waiting for '%s' commit, %d '%s' commits known\n",
state.nr_good),
terms->term_bad, state.nr_good, terms->term_good);
else
bisect_log_printf(_("status: waiting for good commit(s), bad commit known\n"));
bisect_log_printf(_("status: waiting for '%s' commit(s), '%s' commit known\n"),
terms->term_good, terms->term_bad);
}

static int bisect_next_check(const struct bisect_terms *terms,
Expand Down Expand Up @@ -513,8 +516,8 @@ static int bisect_terms(struct bisect_terms *terms, const char *option)
return error(_("no terms defined"));

if (!option) {
printf(_("Your current terms are %s for the old state\n"
"and %s for the new state.\n"),
printf(_("Your current terms are '%s' for the old state\n"
"and '%s' for the new state.\n"),
terms->term_good, terms->term_bad);
return 0;
}
Expand Down Expand Up @@ -632,7 +635,7 @@ static int bisect_skipped_commits(struct bisect_terms *terms)
strbuf_reset(&commit_name);
repo_format_commit_message(the_repository, commit, "%s",
&commit_name, &pp);
fprintf(fp, "# possible first %s commit: [%s] %s\n",
fprintf(fp, "# possible first '%s' commit: [%s] %s\n",
terms->term_bad, oid_to_hex(&commit->object.oid),
commit_name.buf);
}
Expand Down Expand Up @@ -663,7 +666,7 @@ static int bisect_successful(struct bisect_terms *terms)
repo_format_commit_message(the_repository, commit, "%s", &commit_name,
&pp);

res = append_to_file(git_path_bisect_log(), "# first %s commit: [%s] %s\n",
res = append_to_file(git_path_bisect_log(), "# first '%s' commit: [%s] %s\n",
terms->term_bad, oid_to_hex(&commit->object.oid),
commit_name.buf);

Expand Down Expand Up @@ -1262,14 +1265,14 @@ static int bisect_run(struct bisect_terms *terms, int argc, const char **argv)
int rc = verify_good(terms, command.buf);
is_first_run = 0;
if (rc < 0 || 128 <= rc) {
error(_("unable to verify %s on good"
" revision"), command.buf);
error(_("unable to verify %s on '%s' revision"),
command.buf, terms->term_good);
res = BISECT_FAILED;
break;
}
if (rc == res) {
error(_("bogus exit code %d for good revision"),
rc);
error(_("bogus exit code %d for '%s' revision"),
rc, terms->term_good);
res = BISECT_FAILED;
break;
}
Expand Down Expand Up @@ -1314,7 +1317,7 @@ static int bisect_run(struct bisect_terms *terms, int argc, const char **argv)
puts(_("bisect run success"));
res = BISECT_OK;
} else if (res == BISECT_INTERNAL_SUCCESS_1ST_BAD_FOUND) {
puts(_("bisect found first bad commit"));
printf(_("bisect found first '%s' commit\n"), terms->term_bad);
res = BISECT_OK;
} else if (res) {
error(_("bisect run failed: 'git bisect %s'"
Expand Down
Loading