From: "W. Trevor King" <wking@xxxxxxxxxx> In another branch of the submodule thread Francesco kicked off, I mentioned that we could store the preferred local submodule branch on a per-superbranch level if we used the .git/modules/<submodule-name>/config for local overrides [1]. Here's a patch series that greatly extends my v2 "submodule: Respect requested branch on all clones" series [2] to also support automatic, recursive submodule checkouts, as I outlined here [3]. After this series, I can get through: # create the subproject mkdir subproject && ( cd subproject && git init && echo 'Hello, world' > README && git add README && git commit -m 'Subproject v1' ) && # create the superproject mkdir superproject ( cd superproject && git init && git submodule add ../subproject submod && git config -f .gitmodules submodule.submod.update merge && git commit -am 'Superproject v1' && ( # 'submodule update' doesn't look in .gitmodules (yet [4]) for a # default update mode. Copy submodule.submod.update over to # .git/config git submodule init ) ) && # start a feature branch on the superproject ( cd superproject && #git checkout -b my-feature --recurse-submodules && ( # 'git submodule checkout --recurse-submodules' doesn't exist yet, so... git checkout -b my-feature && git submodule checkout -b --gitmodules ) && ( cd submod && echo 'Add the subproject side of this feature' > my-feature && git add my-feature && git commit -m 'Add my feature to the subproject' ) && echo 'Add the superproject side of this feature' > my-feature && git add my-feature && git commit -am 'Add the feature to the superproject' ) && # meanwhile, the subproject has been advancing ( cd subproject && echo 'Goodbye, world' >> README && git commit -am 'Subproject v2' ) && # we need to get that critical advance into the superproject quick! ( cd superproject && # update the master branch #git checkout --recurse-submodules master ( # 'git checkout --recurse-submodules' doesn't exist yet [5,6]. # Even with that patch, 'git checkout' won't respect # submodule.<name>.local-branch without further work. git checkout master && git submodule checkout ) && git submodule update --remote && git commit -am 'Catch submod up with Subproject v2' && # update the my-feature branch #git checkout --recurse-submodules my-feature && ( # 'git checkout --recurse-submodules' doesn't exist yet [5,6]. git checkout my-feature && git submodule checkout ) && git submodule update --remote && git commit -am 'Catch submod up with Subproject v2' && # what does the history look like? ( cd submod && git --no-pager log --graph --date-order --oneline --decorate --all # * 16d9e3e (HEAD, my-feature) Merge commit 'f5e134d5747ee4a206e96d8c017f92f5b29a07f3' into my-feature # |\ # | * f5e134d (origin/master, origin/HEAD, master) Subproject v2 # * | 0a1cd07 Add my feature to the subproject # |/ # * c2d32ba Subproject v1 ) && printf 'master: ' && git ls-tree master submod && # master: 160000 commit f5e134d5747ee4a206e96d8c017f92f5b29a07f3 submod printf 'my-feature: ' && git ls-tree my-feature submod # my-feature: 160000 commit 16d9e3ea2fb57e7a166587203abdb328f90895d1 submod ) git --version # git version 1.8.5.2.237.g01c62c6 I think the first three patches are fairly solid. The last one gets through the above script, but I'd need a more thorough test suite before I trusted it. I tried to be detailed in the commit messages, but of course, we'd want some user-facing documentation if we actually merged something like this series. I'm sending it to the list mostly to explain my current views and re-focus debate [1]. [1]: http://article.gmane.org/gmane.comp.version-control.git/240240 [2]: http://article.gmane.org/gmane.comp.version-control.git/239967 [3]: http://article.gmane.org/gmane.comp.version-control.git/240192 [4]: http://article.gmane.org/gmane.comp.version-control.git/239246 [5]: http://thread.gmane.org/gmane.comp.version-control.git/239695 [6]: http://article.gmane.org/gmane.comp.version-control.git/240117 Cheers, Trevor W. Trevor King (4): submodule: Add helpers for configurable local branches submodule: Teach 'update' to preserve local branches submodule: Teach 'add' about a configurable local-branch submodule: Add a new 'checkout' command git-submodule.sh | 152 ++++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 138 insertions(+), 14 deletions(-) -- 1.8.5.2.237.g01c62c6 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html