Skip to content

Recursive submodule checkout

Jens Lehmann edited this page Feb 3, 2014 · 6 revisions

This effort is about teaching am, apply, bisect, checkout, checkout-index, cherry-pick, merge, pull, read-tree, rebase, reset & stash to recursively update submodule work trees according to the commit recorded in the superproject (which gets rid of having to run “git submodule update” every time something changes).

You find the current state of this series in the recusive_submodule_checkout branch in this repo.

Be warned: the code is still experimental and might damage your data!
Especially when removing a submodule on checkout all ignored untracked files inside it will be lost! (and it’ll stay that way until the discussed ignored-but-precious attribute is implemented in Git)

Having said that, I already use this code for quite some time at my dayjob and it’s working fine for me.

Stuff that’s currently known not to work:

  • Interactive rebase doesn’t update submodule work trees
  • A recreated submodule won’t appear on first checkout (but it will on the second checkout; a fix for that is being worked on)
  • A non-interactive rebase empties changed submodules

Please mail me if you find another problem so we can take care of it (patches are also welcome ;-).

How to test it

First, check out the recusive_submodule_checkout branch. Then either

  • Use the --recurse-submodules option with the commands that already learned it.
  • Put a “return 1” in the first line of submodule_needs_update() in submodule.c in a commit on top of it (this enables unconditional recursive checkout and will be needed until the configuration options are implemented and mature enough; but it breaks quite some tests).
Clone this wiki locally