diff --git a/Documentation/config/checkout.txt b/Documentation/config/checkout.txt index e3684a54599d97ba8a8729b3958ca57d4fbd4b8f..2cddf7b4b40213155a09e85e6499508fc4a30c86 100644 --- a/Documentation/config/checkout.txt +++ b/Documentation/config/checkout.txt @@ -16,3 +16,8 @@ will checkout the `` branch on another remote, and by linkgit:git-worktree[1] when `git worktree add` refers to a remote branch. This setting might be used for other checkout-like commands or functionality in the future. + +checkout.guess:: + Provides the default value for the `--guess` or `--no-guess` + option in `git checkout` and `git switch`. See + linkgit:git-switch[1] and linkgit:git-checkout[1]. diff --git a/Documentation/git-checkout.txt b/Documentation/git-checkout.txt index afa5c11fd3c4d58f978e5bb99a03517c642584c6..1435d3de9e6003922a4388f57da877754535824e 100644 --- a/Documentation/git-checkout.txt +++ b/Documentation/git-checkout.txt @@ -192,7 +192,10 @@ branches from there if `` is ambiguous but exists on the 'origin' remote. See also `checkout.defaultRemote` in linkgit:git-config[1]. + -Use `--no-guess` to disable this. +`--guess` is the default behavior. Use `--no-guess` to disable it. ++ +The default behavior can be set via the `checkout.guess` configuration +variable. -l:: Create the new branch's reflog; see linkgit:git-branch[1] for diff --git a/Documentation/git-switch.txt b/Documentation/git-switch.txt index 3759c3a265b5b9761a9df4d8e6b9d733d29aee04..5c438cd505875841763f0151dfe0a2c1454dfcc5 100644 --- a/Documentation/git-switch.txt +++ b/Documentation/git-switch.txt @@ -103,6 +103,9 @@ ambiguous but exists on the 'origin' remote. See also `checkout.defaultRemote` in linkgit:git-config[1]. + `--guess` is the default behavior. Use `--no-guess` to disable it. ++ +The default behavior can be set via the `checkout.guess` configuration +variable. -f:: --force:: diff --git a/builtin/checkout.c b/builtin/checkout.c index 0951f8fee5cc2a88ac9e08009a69eaf446b6fed4..0c0394a0d653fe9c2f615e2ff65fd5311d127f47 100644 --- a/builtin/checkout.c +++ b/builtin/checkout.c @@ -1093,11 +1093,16 @@ static int switch_branches(const struct checkout_opts *opts, static int git_checkout_config(const char *var, const char *value, void *cb) { + struct checkout_opts *opts = cb; + if (!strcmp(var, "diff.ignoresubmodules")) { - struct checkout_opts *opts = cb; handle_ignore_submodules_arg(&opts->diff_options, value); return 0; } + if (!strcmp(var, "checkout.guess")) { + opts->dwim_new_local_branch = git_config_bool(var, value); + return 0; + } if (starts_with(var, "submodule.")) return git_default_submodule_config(var, value, NULL); diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash index 0a96ad87e7b6d8723175d3b97c18921ddc737d7b..5f09dd9bad26cb191c71e069cd653eb937df443d 100644 --- a/contrib/completion/git-completion.bash +++ b/contrib/completion/git-completion.bash @@ -1467,14 +1467,15 @@ _git_bundle () # Helper function to decide whether or not we should enable DWIM logic for # git-switch and git-checkout. # -# To decide between the following rules in priority order -# 1) the last provided of "--guess" or "--no-guess" explicitly enable or -# disable completion of DWIM logic respectively. -# 2) If the --no-track option is provided, take this as a hint to disable the -# DWIM completion logic -# 3) If GIT_COMPLETION_CHECKOUT_NO_GUESS is set, disable the DWIM completion -# logic, as requested by the user. -# 4) Enable DWIM logic otherwise. +# To decide between the following rules in decreasing priority order: +# - the last provided of "--guess" or "--no-guess" explicitly enable or +# disable completion of DWIM logic respectively. +# - If checkout.guess is false, disable completion of DWIM logic. +# - If the --no-track option is provided, take this as a hint to disable the +# DWIM completion logic +# - If GIT_COMPLETION_CHECKOUT_NO_GUESS is set, disable the DWIM completion +# logic, as requested by the user. +# - Enable DWIM logic otherwise. # __git_checkout_default_dwim_mode () { @@ -1485,11 +1486,17 @@ __git_checkout_default_dwim_mode () fi # --no-track disables DWIM, but with lower priority than - # --guess/--no-guess + # --guess/--no-guess/checkout.guess if [ -n "$(__git_find_on_cmdline "--no-track")" ]; then dwim_opt="" fi + # checkout.guess = false disables DWIM, but with lower priority than + # --guess/--no-guess + if [ "$(__git config --type=bool checkout.guess)" = "false" ]; then + dwim_opt="" + fi + # Find the last provided --guess or --no-guess last_option="$(__git_find_last_on_cmdline "--guess --no-guess")" case "$last_option" in diff --git a/t/t2024-checkout-dwim.sh b/t/t2024-checkout-dwim.sh index accfa9aa4bd82a5f13d3ce5e3755f33f47b38e3e..a4f8d3a67e8a4a36d6bccdda6a83da15c53ee5f3 100755 --- a/t/t2024-checkout-dwim.sh +++ b/t/t2024-checkout-dwim.sh @@ -166,6 +166,17 @@ test_expect_success '--no-guess suppresses branch auto-vivification' ' test_branch master ' +test_expect_success 'checkout.guess = false suppresses branch auto-vivification' ' + git checkout -B master && + status_uno_is_clean && + test_might_fail git branch -D bar && + + test_config checkout.guess false && + test_must_fail git checkout bar && + test_must_fail git rev-parse --verify refs/heads/bar && + test_branch master +' + test_expect_success 'setup more remotes with unconventional refspecs' ' git checkout -B master && status_uno_is_clean && diff --git a/t/t2060-switch.sh b/t/t2060-switch.sh index 2c1b8c0d6d22469fadd9eeb05a19c1b7a53d0f51..68c9101b02f32d943ec5c167d7a726747f5970e4 100755 --- a/t/t2060-switch.sh +++ b/t/t2060-switch.sh @@ -85,9 +85,12 @@ test_expect_success 'switching ignores file of same branch name' ' test_cmp expected actual ' -test_expect_success 'guess and create branch ' ' +test_expect_success 'guess and create branch' ' test_when_finished git switch master && test_must_fail git switch --no-guess foo && + test_config checkout.guess false && + test_must_fail git switch foo && + test_config checkout.guess true && git switch foo && echo refs/heads/foo >expected && git symbolic-ref HEAD >actual && diff --git a/t/t9902-completion.sh b/t/t9902-completion.sh index 7b7bc6e4bd86a39e5d0eeede2eb566efe434e239..eb9e56c39eb331b22d336f29ec9e3f07a39a4649 100755 --- a/t/t9902-completion.sh +++ b/t/t9902-completion.sh @@ -1360,6 +1360,58 @@ test_expect_success 'git checkout - a later --no-guess overrides previous --gues EOF ' +test_expect_success 'git checkout - with checkout.guess = false, only completes refs' ' + test_config checkout.guess false && + test_completion "git checkout " <<-\EOF + HEAD Z + master Z + matching-branch Z + matching-tag Z + other/branch-in-other Z + other/master-in-other Z + EOF +' + +test_expect_success 'git checkout - with checkout.guess = true, completes refs and unique remote branches for DWIM' ' + test_config checkout.guess true && + test_completion "git checkout " <<-\EOF + HEAD Z + branch-in-other Z + master Z + master-in-other Z + matching-branch Z + matching-tag Z + other/branch-in-other Z + other/master-in-other Z + EOF +' + +test_expect_success 'git checkout - a later --guess overrides previous checkout.guess = false, complete refs and unique remote branches for DWIM' ' + test_config checkout.guess false && + test_completion "git checkout --guess " <<-\EOF + HEAD Z + branch-in-other Z + master Z + master-in-other Z + matching-branch Z + matching-tag Z + other/branch-in-other Z + other/master-in-other Z + EOF +' + +test_expect_success 'git checkout - a later --no-guess overrides previous checkout.guess = true, complete only refs' ' + test_config checkout.guess true && + test_completion "git checkout --no-guess " <<-\EOF + HEAD Z + master Z + matching-branch Z + matching-tag Z + other/branch-in-other Z + other/master-in-other Z + EOF +' + test_expect_success 'git switch - with --detach, complete all references' ' test_completion "git switch --detach " <<-\EOF HEAD Z