From: Ben Peart <benpe...@microsoft.com> This itteration avoids the refresh_index() call completely if 'quiet'. The advantage of this is that "git refresh" without any pathspec is also significantly sped up.
Also added a notification if finding unstaged changes after reset takes longer than 2 seconds to make users aware of the option to speed it up if they don't need the unstaged changes after reset to be output. It also renames the new config setting reset.quietDefault to reset.quiet. Base Ref: Web-Diff: https://github.com/benpeart/git/commit/50d3415ef1 Checkout: git fetch https://github.com/benpeart/git reset-refresh-index-v2 && git checkout 50d3415ef1 ### Interdiff (v1..v2): diff --git a/Documentation/config.txt b/Documentation/config.txt index a5cf4c019b..a2d1b8b116 100644 --- a/Documentation/config.txt +++ b/Documentation/config.txt @@ -2728,11 +2728,8 @@ rerere.enabled:: `$GIT_DIR`, e.g. if "rerere" was previously used in the repository. -reset.quietDefault:: - Sets the default value of the "quiet" option for the reset command. - Choosing "quiet" can optimize the performance of the reset command - by avoiding the scan of all files in the repo looking for additional - unstaged changes. Defaults to false. +reset.quiet:: + When set to true, 'git reset' will default to the '--quiet' option. include::sendemail-config.txt[] diff --git a/Documentation/git-reset.txt b/Documentation/git-reset.txt index 8610309b55..1d697d9962 100644 --- a/Documentation/git-reset.txt +++ b/Documentation/git-reset.txt @@ -95,9 +95,7 @@ OPTIONS -q:: --quiet:: - Be quiet, only report errors. Can optimize the performance of reset - by avoiding scaning all files in the repo looking for additional - unstaged changes. + Be quiet, only report errors. EXAMPLES diff --git a/builtin/reset.c b/builtin/reset.c index 7d151d48a0..d95a27d52e 100644 --- a/builtin/reset.c +++ b/builtin/reset.c @@ -25,6 +25,8 @@ #include "submodule.h" #include "submodule-config.h" +#define REFRESH_INDEX_DELAY_WARNING_IN_MS (2 * 1000) + static const char * const git_reset_usage[] = { N_("git reset [--mixed | --soft | --hard | --merge | --keep] [-q] [<commit>]"), N_("git reset [-q] [<tree-ish>] [--] <paths>..."), @@ -306,7 +308,7 @@ int cmd_reset(int argc, const char **argv, const char *prefix) }; git_config(git_reset_config, NULL); - git_config_get_bool("reset.quietDefault", &quiet); + git_config_get_bool("reset.quiet", &quiet); argc = parse_options(argc, argv, prefix, options, git_reset_usage, PARSE_OPT_KEEP_DASHDASH); @@ -376,9 +378,19 @@ int cmd_reset(int argc, const char **argv, const char *prefix) int flags = quiet ? REFRESH_QUIET : REFRESH_IN_PORCELAIN; if (read_from_tree(&pathspec, &oid, intent_to_add)) return 1; - if (get_git_work_tree()) - refresh_index(&the_index, flags, quiet ? &pathspec : NULL, NULL, + if (!quiet && get_git_work_tree()) { + uint64_t t_begin, t_delta_in_ms; + + t_begin = getnanotime(); + refresh_index(&the_index, flags, NULL, NULL, _("Unstaged changes after reset:")); + t_delta_in_ms = (getnanotime() - t_begin) / 1000000; + if (t_delta_in_ms > REFRESH_INDEX_DELAY_WARNING_IN_MS) { + printf(_("\nIt took %.2f seconds to enumerate unstaged changes after reset. You can\n" + "use '--quiet' to avoid this. Set the config setting reset.quiet to true\n" + "to make this the default."), t_delta_in_ms / 1000.0); + } + } } else { int err = reset_index(&oid, reset_type, quiet); if (reset_type == KEEP && !err) ### Patches Ben Peart (3): reset: don't compute unstaged changes after reset when --quiet reset: add new reset.quiet config setting reset: warn when refresh_index() takes more than 2 seconds Documentation/config.txt | 3 +++ builtin/reset.c | 15 ++++++++++++++- 2 files changed, 17 insertions(+), 1 deletion(-) base-commit: ca63497355222acefcca02b9cbb540a4768f3286 -- 2.18.0.windows.1