[WIP PATCH 3/4] Teach checkout to recursively checkout submodules
From: Jens Lehmann <hidden>
Date: 2016-06-15 22:48:35
Subsystem:
documentation, the rest · Maintainers:
Jonathan Corbet, Linus Torvalds
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 <redacted> --- 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