git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[BUG] Adding a submodule containing submodules in a branch and checkout --recurse-submodules

From
Philippe Blain <levraiphilippeblain@gmail.com>
Date
Sep 24, 2019, 02:59 UTC
Message-ID
<7437BB59-4605-48EC-B05E-E2BDB2D9DABC@gmail.com>
Hello,
I think I have found a bug in the implementation of `git checkout —recurse-submodules $branch` in the case of nested submodules. When I add a submodule that has submodules in a feature branch of the main project, checkout the master branch and then checkout my feature branch again, the submodule is not in the expected state.
As an illustration, the following sequence of commands will not leave the submodule brooklyn in the right state:

mkdir test cd test git init git touch file git add file git commit -m "initial commit" # add a commit on master git checkout -b add-sub # create feature branch git submodule add http://github.com/apache/brooklyn # this repo has submodules itself git submodule update --init --recursive # initialize all nested submodules git commit -m "add brooklyn" git checkout --recurse-submodules master # this removes the brooklyn directory, as expected GIT_TRACE=1 git checkout --recurse-submodules add-sub # this fails to checkout the nested submodules correctly 22:38:13.885971 git.c:439 trace: built-in: git checkout --recurse-submodules add-sub 22:38:13.895776 run-command.c:663 trace: run_command: cd brooklyn; unset GIT_PREFIX; GIT_DIR=.git git --super-prefix=brooklyn/ read-tree -u --reset 4b825dc642cb6eb9a060e54bf8d69288fbee4904 22:38:13.909366 git.c:439 trace: built-in: git read-tree -u --reset 4b825dc642cb6eb9a060e54bf8d69288fbee4904 22:38:13.918464 run-command.c:663 trace: run_command: cd brooklyn; unset GIT_PREFIX; GIT_DIR=.git git --super-prefix=brooklyn/ read-tree --recurse-submodules -u --reset 30f3d2754a98670d57d142193ba51af3038555af 22:38:13.935402 git.c:439 trace: built-in: git read-tree --recurse-submodules -u --reset 30f3d2754a98670d57d142193ba51af3038555af 22:38:13.940017 run-command.c:663 trace: run_command: cd brooklyn-client; unset GIT_INTERNAL_SUPER_PREFIX GIT_PREFIX; GIT_DIR=.git git --super-prefix=brooklyn/brooklyn-client/ read-tree --recurse-submodules -n --reset 05031a79d4724b867db76b7c4afe55190666c7af fatal: exec '--super-prefix=brooklyn/brooklyn-client/': cd to 'brooklyn-client' failed: No such file or directory error: Submodule 'brooklyn-client' could not be updated. error: Submodule 'brooklyn/brooklyn-client' cannot checkout new HEAD. error: Submodule 'brooklyn' could not be updated. 22:38:13.947005 run-command.c:663 trace: run_command: cd brooklyn; unset GIT_PREFIX; GIT_DIR=.git git status --porcelain=2 22:38:13.962706 git.c:439 trace: built-in: git status --porcelain=2 M brooklyn Switched to branch 'add-sub’

After that, git status says "modified content" for brooklyn; cd-ing into brooklyn and doing git status show everything as deleted, and also some errors related to the git dir of the nested submodules : On branch master Your branch is up to date with 'origin/master'.

Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)
	deleted:    .gitattributes
	deleted:    .gitignore
	deleted:    .gitmodules
	deleted:    .mvn/jvm.config
	deleted:    Dockerfile
	deleted:    Jenkinsfile
	deleted:    LICENSE
	deleted:    NOTICE
	deleted:    README.md
	deleted:    brooklyn-client
	deleted:    brooklyn-dist
	deleted:    brooklyn-docs
	deleted:    brooklyn-library
	deleted:    brooklyn-server
	deleted:    brooklyn-ui
	deleted:    doap_Brooklyn.rdf
	deleted:    pom.xml

fatal: not a git repository: 'brooklyn-client/.git' fatal: not a git repository: 'brooklyn-dist/.git' fatal: not a git repository: 'brooklyn-docs/.git' fatal: not a git repository: 'brooklyn-library/.git' fatal: not a git repository: 'brooklyn-server/.git' fatal: not a git repository: 'brooklyn-ui/.git' Submodule changes to be committed:

* brooklyn-client 05031a7...0000000:
* brooklyn-dist 3a30944...0000000:
* brooklyn-docs 2b06e96...0000000:
* brooklyn-library a94f7d8...0000000:
* brooklyn-server e601350...0000000:
* brooklyn-ui 503d74e...0000000:
To get back to the state I was on branch add-sub before checking out master, I need to do "git submodule update --recursive --force". I don’t think this is expected behaviour, it is rather confusing.

Cheers, Philippe Blain.

Message 1 of 1 in “[BUG] Adding a submodule containing submodules in a branch and checkout --recurse-submodules”
  1. Philippe BlainSep 24, 2019

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.