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 | 19 +++++++++++++++++++ 4 files changed, 31 insertions(+), 5 deletions(-) diff --git a/Documentation/config.txt b/Documentation/config.txt index a0ab66a..67e0714 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 a0ea2c5..819c430 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 2149ef7..0c807d9 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 60f6987..788c59d 100755 --- a/t/t2013-checkout-submodule.sh +++ b/t/t2013-checkout-submodule.sh @@ -149,6 +149,25 @@ test_expect_success '"checkout --recurse-submodules" repopulates submodule' ' ) ' +test_expect_success 'option checkout.recurseSubmodules updates submodule' ' + test_config -C super checkout.recurseSubmodules 1 && + ( + cd super && + 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' ' ( cd super && -- 2.10.1.469.g00a8914