mirror of
https://github.com/git/git.git
synced 2025-12-12 20:36:24 +01:00
status: modernize git-status "slow untracked files" advice
`git status` can be slow when there are a large number of untracked files and directories since Git must search the entire worktree to enumerate them. When it is too slow, Git prints advice with the elapsed search time and a suggestion to disable the search using the `-uno` option. This suggestion also carries a warning that might scare off some users. However, these days, `-uno` isn't the only option. Git can reduce the time taken to enumerate untracked files by caching results from previous `git status` invocations, when the `core.untrackedCache` and `core.fsmonitor` features are enabled. Update the `git status` man page to explain these configuration options, and update the advice to provide more detail about the current configuration and to refer to the updated documentation. Signed-off-by: Rudy Rigot <rudy.rigot@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
committed by
Junio C Hamano
parent
c000d91638
commit
ecbc23e4c5
28
wt-status.c
28
wt-status.c
@@ -18,8 +18,10 @@
|
||||
#include "worktree.h"
|
||||
#include "lockfile.h"
|
||||
#include "sequencer.h"
|
||||
#include "fsmonitor-settings.h"
|
||||
|
||||
#define AB_DELAY_WARNING_IN_MS (2 * 1000)
|
||||
#define UF_DELAY_WARNING_IN_MS (2 * 1000)
|
||||
|
||||
static const char cut_line[] =
|
||||
"------------------------ >8 ------------------------\n";
|
||||
@@ -1205,6 +1207,13 @@ static void wt_longstatus_print_tracking(struct wt_status *s)
|
||||
strbuf_release(&sb);
|
||||
}
|
||||
|
||||
static int uf_was_slow(struct wt_status *s)
|
||||
{
|
||||
if (getenv("GIT_TEST_UF_DELAY_WARNING"))
|
||||
s->untracked_in_ms = 3250;
|
||||
return UF_DELAY_WARNING_IN_MS < s->untracked_in_ms;
|
||||
}
|
||||
|
||||
static void show_merge_in_progress(struct wt_status *s,
|
||||
const char *color)
|
||||
{
|
||||
@@ -1814,6 +1823,7 @@ static void wt_longstatus_print(struct wt_status *s)
|
||||
{
|
||||
const char *branch_color = color(WT_STATUS_ONBRANCH, s);
|
||||
const char *branch_status_color = color(WT_STATUS_HEADER, s);
|
||||
enum fsmonitor_mode fsm_mode = fsm_settings__get_mode(s->repo);
|
||||
|
||||
if (s->branch) {
|
||||
const char *on_what = _("On branch ");
|
||||
@@ -1870,13 +1880,21 @@ static void wt_longstatus_print(struct wt_status *s)
|
||||
wt_longstatus_print_other(s, &s->untracked, _("Untracked files"), "add");
|
||||
if (s->show_ignored_mode)
|
||||
wt_longstatus_print_other(s, &s->ignored, _("Ignored files"), "add -f");
|
||||
if (advice_enabled(ADVICE_STATUS_U_OPTION) && 2000 < s->untracked_in_ms) {
|
||||
if (advice_enabled(ADVICE_STATUS_U_OPTION) && uf_was_slow(s)) {
|
||||
status_printf_ln(s, GIT_COLOR_NORMAL, "%s", "");
|
||||
if (fsm_mode > FSMONITOR_MODE_DISABLED) {
|
||||
status_printf_ln(s, GIT_COLOR_NORMAL,
|
||||
_("It took %.2f seconds to enumerate untracked files,\n"
|
||||
"but the results were cached, and subsequent runs may be faster."),
|
||||
s->untracked_in_ms / 1000.0);
|
||||
} else {
|
||||
status_printf_ln(s, GIT_COLOR_NORMAL,
|
||||
_("It took %.2f seconds to enumerate untracked files."),
|
||||
s->untracked_in_ms / 1000.0);
|
||||
}
|
||||
status_printf_ln(s, GIT_COLOR_NORMAL,
|
||||
_("It took %.2f seconds to enumerate untracked files. 'status -uno'\n"
|
||||
"may speed it up, but you have to be careful not to forget to add\n"
|
||||
"new files yourself (see 'git help status')."),
|
||||
s->untracked_in_ms / 1000.0);
|
||||
_("See 'git help status' for information on how to improve this."));
|
||||
status_printf_ln(s, GIT_COLOR_NORMAL, "%s", "");
|
||||
}
|
||||
} else if (s->committable)
|
||||
status_printf_ln(s, GIT_COLOR_NORMAL, _("Untracked files not listed%s"),
|
||||
|
||||
Reference in New Issue
Block a user