Thread (3 messages) 3 messages, 3 authors, 2022-01-27

git worktree, submodule and force checkout/switch

From: Federico Kircheis <hidden>
Date: 2022-01-26 16:43:27

Hello to everyone,

I would like to report what I believe is a bug, or at least an 
inconsistent behavior when using submodules and worktrees.


Consider following test-case

----
# create 2 repositories with one commit
mkdir repo1 && (cd repo1 && git init && git commit --allow-empty -m "repo1")
mkdir repo2 && (cd repo2 && git init && git commit --allow-empty -m "repo2")

# add submodule, a couple of branches, and a worktree
cd repo1
git submodule add ../repo2 && git commit -m "add submodule"
git switch -c branch1
git switch -c branch2
git worktree add ../repo1.w --detach


# test switch in the worktree
cd ../repo1.w
# git switch works
git switch --recurse-submodule branch1
git switch --recurse-submodule master
#git submodule update # (1)
cat .git
cat .gitmodules
cat repo2/.git # (2)
git switch --force branch1 # (3)error if no submodule update
----


Notice that if one forgets to git submodule update (1) before git switch 
--force branch1, even when using --recurse-submodule, there is no 
submodule, as repo1.w/repo2/ is empty (2).

It is confusing/unexpected that git switch --force fails and creates a 
repo1.w/repo2/.git file pointing to the wrong location.


As comparison, when cloning a repository and forgetting to do "git 
submodule update", then "git switch --force branch1" works as expected:



----
# create 2 repositories with one commit
mkdir repo1 && (cd repo1 && git init && git commit --allow-empty -m "repo1")
mkdir repo2 && (cd repo2 && git init && git commit --allow-empty -m "repo2")

cd repo1
git submodule add ../repo2 && git commit -m "add submodule"
git switch -c branch1
git switch -c branch2

cd ..
git clone repo1 repo1.c
cd repo1.c
git switch branch2
git switch --force branch1 # works, event without git submodule update
----




Notice:
In both cases "git switch" and "git checkout" behave the same.
Also the parameter "--recurse-submodule" does not change anything.


Best

Federico


PS: I'm not subscribed to the mailing list (yet), so please keep me in CC.
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help