To make it easier for the user, who doesn't want to give the `--recurse-submodules` option whenever they run checkout, have an option for to set the default behavior for checkout to recurse into submodules. Signed-off-by: Stefan Beller <sbeller@xxxxxxxxxx> --- Documentation/config.txt | 6 ++++++ Documentation/git-checkout.txt | 5 +++-- submodule.c | 6 +++--- t/t2013-checkout-submodule.sh | 16 ++++++++++++++++ 4 files changed, 28 insertions(+), 5 deletions(-) diff --git a/Documentation/config.txt b/Documentation/config.txt index a0ab66aae7..67e0714358 100644 --- a/Documentation/config.txt +++ b/Documentation/config.txt @@ -949,6 +949,12 @@ clean.requireForce:: A boolean to make git-clean do nothing unless given -f, -i or -n. Defaults to true. +checkout.recurseSubmodules:: + This option can be set to a boolean value. + When set to true checkout will recurse into submodules and + update them. When set to false, which is the default, checkout + will leave submodules untouched. + color.branch:: A boolean to enable/disable color in the output of linkgit:git-branch[1]. May be set to `always`, diff --git a/Documentation/git-checkout.txt b/Documentation/git-checkout.txt index a0ea2c5651..819c430b6e 100644 --- a/Documentation/git-checkout.txt +++ b/Documentation/git-checkout.txt @@ -260,8 +260,9 @@ section of linkgit:git-add[1] to learn how to operate the `--patch` mode. Using --recurse-submodules will update the content of all initialized submodules according to the commit recorded in the superproject. If local modifications in a submodule would be overwritten the checkout - will fail until `-f` is used. If nothing (or --no-recurse-submodules) - is used, the work trees of submodules will not be updated. + will fail until `-f` is used. If `--no-recurse-submodules` is used, + the work trees of submodules will not be updated. If no command line + argument is given, `checkout.recurseSubmodules` is used as a default. <branch>:: Branch to checkout; if it refers to a branch (i.e., a name that, diff --git a/submodule.c b/submodule.c index 4253f7f044..e4e326bce4 100644 --- a/submodule.c +++ b/submodule.c @@ -160,10 +160,10 @@ int submodule_config(const char *var, const char *value, void *cb) return 0; } else if (starts_with(var, "submodule.")) return parse_submodule_config_option(var, value); - else if (!strcmp(var, "fetch.recursesubmodules")) { + else if (!strcmp(var, "fetch.recursesubmodules")) config_fetch_recurse_submodules = parse_fetch_recurse_submodules_arg(var, value); - return 0; - } + else if (!strcmp(var, "checkout.recursesubmodules")) + config_update_recurse_submodules = parse_update_recurse_submodules_arg(var, value); return 0; } diff --git a/t/t2013-checkout-submodule.sh b/t/t2013-checkout-submodule.sh index 33fb2f5de3..673021fb80 100755 --- a/t/t2013-checkout-submodule.sh +++ b/t/t2013-checkout-submodule.sh @@ -137,6 +137,22 @@ test_expect_success '"checkout --recurse-submodules" repopulates submodule' ' submodule_creation_must_succeed delete_submodule base ' +test_expect_success 'option checkout.recurseSubmodules updates submodule' ' + test_config checkout.recurseSubmodules 1 && + git checkout base && + git checkout -b advanced-base && + git -C submodule commit --allow-empty -m "empty commit" && + git add submodule && + git commit -m "advance submodule" && + git checkout base && + git diff-files --quiet && + git diff-index --quiet --cached base && + git checkout advanced-base && + git diff-files --quiet && + git diff-index --quiet --cached advanced-base && + git checkout --recurse-submodules base +' + test_expect_success '"checkout --recurse-submodules" repopulates submodule in existing directory' ' git checkout --recurse-submodules delete_submodule && mkdir submodule && -- 2.11.0.rc2.28.g2673dad