Change the default behavior of "git checkout" to check out submodules too. This can be prevented by using the new "--ignore-submodules" option. Signed-off-by: Jens Lehmann <Jens.Lehmann@xxxxxx> --- Documentation/git-checkout.txt | 7 +++++++ builtin/checkout.c | 7 ++++++- t/t2013-checkout-submodule.sh | 14 ++++++++++++-- 3 files changed, 25 insertions(+), 3 deletions(-) diff --git a/Documentation/git-checkout.txt b/Documentation/git-checkout.txt index 4505eb6..63ac3bc 100644 --- a/Documentation/git-checkout.txt +++ b/Documentation/git-checkout.txt @@ -144,6 +144,13 @@ the conflicted merge in the specified paths. This means that you can use `git checkout -p` to selectively discard edits from your current working tree. +--ignore-submodules:: + Since version 1.8.0 the default behavior is to checkout populated + submodules recursively. When this option is used, the work trees of + submodules will not be updated, only the hash recorded in the + superproject will be changed (this was the default behavior until + 1.8.0). + <branch>:: Branch to checkout; if it refers to a branch (i.e., a name that, when prepended with "refs/heads/", is a valid ref), then that diff --git a/builtin/checkout.c b/builtin/checkout.c index ee198ae..0008ec5 100644 --- a/builtin/checkout.c +++ b/builtin/checkout.c @@ -31,6 +31,7 @@ struct checkout_opts { int force; int writeout_stage; int writeout_error; + int ignore_submodules; const char *new_branch; const char *new_orphan_branch; @@ -248,7 +249,7 @@ static int checkout_paths(struct tree *source_tree, const char **pathspec, memset(&state, 0, sizeof(state)); state.force = 1; state.refresh_cache = 1; - state.ignore_submodules = 1; + state.ignore_submodules = opts->ignore_submodules; for (pos = 0; pos < active_nr; pos++) { struct cache_entry *ce = active_cache[pos]; if (match_pathspec(pathspec, ce->name, ce_namelen(ce), 0, NULL)) { @@ -314,6 +315,7 @@ static int reset_tree(struct tree *tree, struct checkout_opts *o, int worktree) opts.verbose_update = !o->quiet; opts.src_index = &the_index; opts.dst_index = &the_index; + opts.ignore_submodules = o->ignore_submodules; parse_tree(tree); init_tree_desc(&tree_desc, tree->buffer, tree->size); switch (unpack_trees(1, &tree_desc, &opts)) { @@ -393,6 +395,7 @@ static int merge_working_tree(struct checkout_opts *opts, topts.dir = xcalloc(1, sizeof(*topts.dir)); topts.dir->flags |= DIR_SHOW_IGNORED; topts.dir->exclude_per_dir = ".gitignore"; + topts.ignore_submodules = opts->ignore_submodules; tree = parse_tree_indirect(old->commit ? old->commit->object.sha1 : (unsigned char *)EMPTY_TREE_SHA1_BIN); @@ -649,6 +652,8 @@ int cmd_checkout(int argc, const char **argv, const char *prefix) { OPTION_BOOLEAN, 0, "guess", &dwim_new_local_branch, NULL, "second guess 'git checkout no-such-branch'", PARSE_OPT_NOARG | PARSE_OPT_HIDDEN }, + OPT_BOOLEAN(0, "ignore-submodules", &opts.ignore_submodules, + "don't update submodule work trees"), OPT_END(), }; int has_dash_dash; diff --git a/t/t2013-checkout-submodule.sh b/t/t2013-checkout-submodule.sh index fda3f0a..e5f2e6e 100755 --- a/t/t2013-checkout-submodule.sh +++ b/t/t2013-checkout-submodule.sh @@ -29,14 +29,24 @@ test_expect_success '"reset <submodule>" updates the index' ' git diff-files --quiet ' -test_expect_success '"checkout <submodule>" updates the index only' ' +test_expect_success '"checkout --ignore-submodules <submodule>" updates the index only' ' git update-index --refresh && git diff-files --quiet && git diff-index --quiet --cached HEAD && - git checkout HEAD^ submodule && + git checkout --ignore-submodules HEAD^ submodule && test_must_fail git diff-files --quiet && git checkout HEAD submodule && git diff-files --quiet ' +test_expect_success '"checkout <submodule>" updates recursively' ' + git update-index --refresh && + git diff-files --quiet && + git diff-index --quiet --cached HEAD && + git checkout HEAD^ submodule && + git diff-files --quiet && + git checkout HEAD submodule && + git diff-files --quiet +' + test_done -- 1.7.1.rc0.248.g09203 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html