commit-graph: add new config for changed-paths & recommend it in scalar
The changed-path Bloom filters feature has proven stable and reliable
over several years of use, delivering significant performance
improvement for file history computation in large monorepos. Currently
a user can opt-in to writing the changed-path Bloom filters using the
"--changed-paths" option to "git commit-graph write". The filters will
be persisted until the user drops the filters using the
"--no-changed-paths" option. For this functionality, refer to 0087a87ba8
(commit-graph: persist existence of changed-paths, 2020-07-01).
Large monorepos using Git's background maintenance to build and update
commit-graph files could use an easy switch to enable this feature
without a foreground computation. In this commit, we're proposing a new
config option "commitGraph.changedPaths":
* If "true", "git commit-graph write" will write Bloom filters,
equivalent to passing "--changed-paths";
* If "false" or "unset", Bloom filters will be written during "git
commit-graph write" only if the filters already exist in the current
commit-graph file. This matches the default behaviour of "git
commit-graph write" without any "--[no-]changed-paths" option. Note
"false" can disable a previous "true" config value but doesn't imply
"--no-changed-paths".
This config will always respect the precedence of command line option
"--[no-]changed-paths".
We also set this new config as optional recommended config in scalar to
turn on this feature for large repos.
Helped-by: Derrick Stolee <stolee@gmail.com>
Signed-off-by: Emily Yang <emilyyang.git@gmail.com>
Acked-by: Derrick Stolee <stolee@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Emily Yang committedOct 17, 2025 at 20:58 UTCfafdf23b2f57bdf6a74513b3cc03902f0a8e954d
5 files changed+59-1
Documentation/config/commitgraph.adoc
+11
index 7f8c9d6638..70a56c53d2 100644--- a/Documentation/config/commitgraph.adoc+++ b/Documentation/config/commitgraph.adoc@@ -8,6 +8,17 @@ commitGraph.maxNewFilters:: Specifies the default value for the `--max-new-filters` option of `git commit-graph write` (c.f., linkgit:git-commit-graph[1]).+commitGraph.changedPaths::+ If true, then `git commit-graph write` will compute and write+ changed-path Bloom filters by default, equivalent to passing+ `--changed-paths`. If false or unset, changed-paths Bloom filters will+ be written during `git commit-graph write` only if the filters already+ exist in the current commit-graph file. This matches the default+ behavior of `git commit-graph write` without any `--[no-]changed-paths`+ option. To rewrite a commit-graph file without any filters, use the+ `--no-changed-paths` option. Command-line option `--[no-]changed-paths`+ always takes precedence over this configuration. Defaults to unset.+ commitGraph.readChangedPaths:: Deprecated. Equivalent to commitGraph.changedPathsVersion=-1 if true, and commitGraph.changedPathsVersion=0 if false. (If commitGraph.changedPathVersion
Documentation/git-commit-graph.adoc
+1-1
index e9558173c0..6d19026035 100644--- a/Documentation/git-commit-graph.adoc+++ b/Documentation/git-commit-graph.adoc@@ -71,7 +71,7 @@ take a while on large repositories. It provides significant performance gains for getting history of a directory or a file with `git log -- <path>`. If this option is given, future commit-graph writes will automatically assume that this option was intended. Use `--no-changed-paths` to stop storing this-data.+data. `--changed-paths` is implied by config `commitGraph.changedPaths=true`. + With the `--max-new-filters=<n>` option, generate at most `n` new Bloom filters (if `--changed-paths` is specified). If `n` is `-1`, no limit is
builtin/commit-graph.c
+2
index fe3ebaadad..d62005edc0 100644--- a/builtin/commit-graph.c+++ b/builtin/commit-graph.c@@ -210,6 +210,8 @@ static int git_commit_graph_write_config(const char *var, const char *value, { if (!strcmp(var, "commitgraph.maxnewfilters")) write_opts.max_new_filters = git_config_int(var, value, ctx->kvi);+ else if (!strcmp(var, "commitgraph.changedpaths"))+ opts.enable_changed_paths = git_config_bool(var, value) ? 1 : -1; /* * No need to fall-back to 'git_default_config', since this was already * called in 'cmd_commit_graph()'.