worktree: teach "add" to ignore submodule.recurse config

"worktree add" internally calls "reset --hard", but if
submodule.recurse is set, reset tries to recurse into
initialized submodules, which makes start_command try to
cd into non-existing submodule paths and die.

Fix that by making sure that the call to reset in "worktree add"
does not recurse.

Signed-off-by: Philippe Blain <levraiphilippeblain@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Philippe Blain 2019-10-27 17:16:25 +00:00 committed by Junio C Hamano
parent 5fa0f5238b
commit 4782cf2ab6
2 changed files with 25 additions and 1 deletions

View file

@ -377,7 +377,7 @@ static int add_worktree(const char *path, const char *refname,
if (opts->checkout) { if (opts->checkout) {
cp.argv = NULL; cp.argv = NULL;
argv_array_clear(&cp.args); argv_array_clear(&cp.args);
argv_array_pushl(&cp.args, "reset", "--hard", NULL); argv_array_pushl(&cp.args, "reset", "--hard", "--no-recurse-submodules", NULL);
if (opts->quiet) if (opts->quiet)
argv_array_push(&cp.args, "--quiet"); argv_array_push(&cp.args, "--quiet");
cp.env = child_env.argv; cp.env = child_env.argv;

View file

@ -587,4 +587,28 @@ test_expect_success '"add" should not fail because of another bad worktree' '
) )
' '
test_expect_success '"add" with uninitialized submodule, with submodule.recurse unset' '
test_create_repo submodule &&
test_commit -C submodule first &&
test_create_repo project &&
git -C project submodule add ../submodule &&
git -C project add submodule &&
test_tick &&
git -C project commit -m add_sub &&
git clone project project-clone &&
git -C project-clone worktree add ../project-2
'
test_expect_success '"add" with uninitialized submodule, with submodule.recurse set' '
git -C project-clone -c submodule.recurse worktree add ../project-3
'
test_expect_success '"add" with initialized submodule, with submodule.recurse unset' '
git -C project-clone submodule update --init &&
git -C project-clone worktree add ../project-4
'
test_expect_success '"add" with initialized submodule, with submodule.recurse set' '
git -C project-clone -c submodule.recurse worktree add ../project-5
'
test_done test_done