diff options
-rw-r--r-- | Documentation/config/feature.txt | 8 | ||||
-rw-r--r-- | Documentation/config/fetch.txt | 10 | ||||
-rw-r--r-- | builtin/fetch.c | 15 | ||||
-rw-r--r-- | repo-settings.c | 4 | ||||
-rw-r--r-- | repository.h | 1 | ||||
-rwxr-xr-x | t/t5510-fetch.sh | 13 |
6 files changed, 51 insertions, 0 deletions
diff --git a/Documentation/config/feature.txt b/Documentation/config/feature.txt index 545522f306..875f8c8a66 100644 --- a/Documentation/config/feature.txt +++ b/Documentation/config/feature.txt @@ -17,6 +17,14 @@ which can improve `git push` performance in repos with many files. + * `fetch.negotiationAlgorithm=skipping` may improve fetch negotiation times by skipping more commits at a time, reducing the number of round trips. ++ +* `fetch.writeCommitGraph=true` writes a commit-graph after every `git fetch` +command that downloads a pack-file from a remote. Using the `--split` option, +most executions will create a very small commit-graph file on top of the +existing commit-graph file(s). Occasionally, these files will merge and the +write may take longer. Having an updated commit-graph file helps performance +of many Git commands, including `git merge-base`, `git push -f`, and +`git log --graph`. feature.manyFiles:: Enable config options that optimize for repos with many files in the diff --git a/Documentation/config/fetch.txt b/Documentation/config/fetch.txt index d402110638..e8cb20547c 100644 --- a/Documentation/config/fetch.txt +++ b/Documentation/config/fetch.txt @@ -69,3 +69,13 @@ fetch.showForcedUpdates:: Set to false to enable `--no-show-forced-updates` in linkgit:git-fetch[1] and linkgit:git-pull[1] commands. Defaults to true. + +fetch.writeCommitGraph:: + Set to true to write a commit-graph after every `git fetch` command + that downloads a pack-file from a remote. Using the `--split` option, + most executions will create a very small commit-graph file on top of + the existing commit-graph file(s). Occasionally, these files will + merge and the write may take longer. Having an updated commit-graph + file helps performance of many Git commands, including `git merge-base`, + `git push -f`, and `git log --graph`. Defaults to false, unless + `feature.experimental` is true. diff --git a/builtin/fetch.c b/builtin/fetch.c index 9b27ae9681..67c0eb88c6 100644 --- a/builtin/fetch.c +++ b/builtin/fetch.c @@ -25,6 +25,7 @@ #include "commit-reach.h" #include "branch.h" #include "promisor-remote.h" +#include "commit-graph.h" #define FORCED_UPDATES_DELAY_WARNING_IN_MS (10 * 1000) @@ -1759,6 +1760,20 @@ int cmd_fetch(int argc, const char **argv, const char *prefix) string_list_clear(&list, 0); + prepare_repo_settings(the_repository); + if (the_repository->settings.fetch_write_commit_graph) { + int commit_graph_flags = COMMIT_GRAPH_WRITE_SPLIT; + struct split_commit_graph_opts split_opts; + memset(&split_opts, 0, sizeof(struct split_commit_graph_opts)); + + if (progress) + commit_graph_flags |= COMMIT_GRAPH_WRITE_PROGRESS; + + write_commit_graph_reachable(get_object_directory(), + commit_graph_flags, + &split_opts); + } + close_object_store(the_repository->objects); if (enable_auto_gc) { diff --git a/repo-settings.c b/repo-settings.c index 3779b85c17..05546db98e 100644 --- a/repo-settings.c +++ b/repo-settings.c @@ -49,10 +49,14 @@ void prepare_repo_settings(struct repository *r) UPDATE_DEFAULT_BOOL(r->settings.index_version, 4); UPDATE_DEFAULT_BOOL(r->settings.core_untracked_cache, UNTRACKED_CACHE_WRITE); } + if (!repo_config_get_bool(r, "fetch.writecommitgraph", &value)) + r->settings.fetch_write_commit_graph = value; if (!repo_config_get_bool(r, "feature.experimental", &value) && value) { UPDATE_DEFAULT_BOOL(r->settings.pack_use_sparse, 1); UPDATE_DEFAULT_BOOL(r->settings.fetch_negotiation_algorithm, FETCH_NEGOTIATION_SKIPPING); + UPDATE_DEFAULT_BOOL(r->settings.fetch_write_commit_graph, 1); } + UPDATE_DEFAULT_BOOL(r->settings.fetch_write_commit_graph, 0); /* Hack for test programs like test-dump-untracked-cache */ if (ignore_untracked_cache_config) diff --git a/repository.h b/repository.h index 4da275e73f..fe0b5f5dc6 100644 --- a/repository.h +++ b/repository.h @@ -30,6 +30,7 @@ struct repo_settings { int core_commit_graph; int gc_write_commit_graph; + int fetch_write_commit_graph; int index_version; enum untracked_cache_setting core_untracked_cache; diff --git a/t/t5510-fetch.sh b/t/t5510-fetch.sh index 34b486f1a4..ecabbe1616 100755 --- a/t/t5510-fetch.sh +++ b/t/t5510-fetch.sh @@ -570,6 +570,19 @@ test_expect_success 'LHS of refspec follows ref disambiguation rules' ' ) ' +test_expect_success 'fetch.writeCommitGraph' ' + git clone three write && + ( + cd three && + test_commit new + ) && + ( + cd write && + git -c fetch.writeCommitGraph fetch origin && + test_path_is_file .git/objects/info/commit-graphs/commit-graph-chain + ) +' + # configured prune tests set_config_tristate () { |