On 2019-01-14 4:34 p.m., Jonathan Nieder wrote:
Hi,
Marc Branchaud wrote:
The new workdir is empty before the checkout, so attempts to recurse into
a non-existent submodule directory fail.
Signed-off-by: Marc Branchaud <marcnarc@xxxxxxxxxxx>
---
Thanks for reporting. Can you describe the error message when it fails
here?
The error is:
fatal: exec '--super-prefix=external/submodule/': cd to
'external/submodule' failed: No such file or directory
The created workdir has only the .git directory. The .git/HEAD file
contains the expected ref, so the workdir repo's status simply shows
that everything has been deleted.
Note that git-worktree also fails when submodule.recurse=true, with the
same error:
# git worktree add ~/Code/foo/test-worktree
Preparing worktree (new branch 'test-worktree')
fatal: exec '--super-prefix=external/submodule/': cd to
'external/submodule' failed: No such file or directory
error: Submodule 'external/submodule' could not be updated.
error: Submodule 'external/submodule' cannot checkout new HEAD.
fatal: Could not reset index file to revision 'HEAD'.
I had assumed that this was simply an aspect of submodules not working,
so I was holding off reporting it until more of the submodule support
was complete.
Until the worktree command supports submodules I've gone back to using the
git-new-workdir script, but it fails if my config has
submdodule.recurse=true.
Oh, dear. In general, the project does a better job at supporting "git
worktree" than "git new-workdir", but I don't blame you about this.
Noting locally as another vote for getting submodules to play well with
worktrees soon.
[...]
contrib/workdir/git-new-workdir | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/contrib/workdir/git-new-workdir b/contrib/workdir/git-new-workdir
index 888c34a521..5de1dc3c58 100755
--- a/contrib/workdir/git-new-workdir
+++ b/contrib/workdir/git-new-workdir
@@ -102,4 +102,4 @@ trap - $siglist
# checkout the branch (either the same as HEAD from the original repository,
# or the one that was asked for)
-git checkout -f $branch
+git -c submodule.recurse=false checkout -f $branch
nit: can this use "git checkout --no-recurse-submodules" instead
of -c?
In general, we tend to recommend that kind of option instead of
--config in scripts.
--no-recurse-submodules does work. I'll send a v2.
M.
Thanks,
Jonathan