Merge branch 'ey/commit-graph-changed-paths-config'

A new configuration variable commitGraph.changedPaths allows to
turn "--changed-paths" on by default for "git commit-graph".

* ey/commit-graph-changed-paths-config:
  commit-graph: add new config for changed-paths & recommend it in scalar
This commit is contained in:
Junio C Hamano
2025-10-30 08:00:18 -07:00
5 changed files with 59 additions and 1 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -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()'.

View File

@@ -166,6 +166,7 @@ static int set_recommended_config(int reconfigure)
#endif
/* Optional */
{ "status.aheadBehind", "false" },
{ "commitGraph.changedPaths", "true" },
{ "commitGraph.generationVersion", "1" },
{ "core.autoCRLF", "false" },
{ "core.safeCRLF", "false" },

View File

@@ -946,4 +946,48 @@ test_expect_success 'stale commit cannot be parsed when traversing graph' '
)
'
test_expect_success 'config commitGraph.changedPaths acts like --changed-paths' '
git init config-changed-paths &&
(
cd config-changed-paths &&
# commitGraph.changedPaths is not set and it should not write Bloom filters
test_commit first &&
GIT_PROGRESS_DELAY=0 git commit-graph write --reachable --progress 2>error &&
test_grep ! "Bloom filters" error &&
# Set commitGraph.changedPaths to true and it should write Bloom filters
test_commit second &&
git config commitGraph.changedPaths true &&
GIT_PROGRESS_DELAY=0 git commit-graph write --reachable --progress 2>error &&
test_grep "Bloom filters" error &&
# Add one more config commitGraph.changedPaths as false to disable the previous true config value
# It should still write Bloom filters due to existing filters
test_commit third &&
git config --add commitGraph.changedPaths false &&
GIT_PROGRESS_DELAY=0 git commit-graph write --reachable --progress 2>error &&
test_grep "Bloom filters" error &&
# commitGraph.changedPaths is still false and command line options should take precedence
test_commit fourth &&
GIT_PROGRESS_DELAY=0 git commit-graph write --no-changed-paths --reachable --progress 2>error &&
test_grep ! "Bloom filters" error &&
GIT_PROGRESS_DELAY=0 git commit-graph write --reachable --progress 2>error &&
test_grep ! "Bloom filters" error &&
# commitGraph.changedPaths is all cleared and then set to false again, command line options should take precedence
test_commit fifth &&
git config --unset-all commitGraph.changedPaths &&
git config commitGraph.changedPaths false &&
GIT_PROGRESS_DELAY=0 git commit-graph write --changed-paths --reachable --progress 2>error &&
test_grep "Bloom filters" error &&
# commitGraph.changedPaths is still false and it should write Bloom filters due to existing filters
test_commit sixth &&
GIT_PROGRESS_DELAY=0 git commit-graph write --reachable --progress 2>error &&
test_grep "Bloom filters" error
)
'
test_done