This is a quick trick for making working with git submodules more magic.
One day you might find that using git submodules is needed for your project. It’s probably not necessary for everyday hacking, but if you’re glue-ing things together, it can be quite useful. Puppet-Gluster uses this technique to easily include all the dependencies needed for a Puppet-Gluster+Vagrant automatic deployment.
If you’re a good hacker, you develop things in separate feature branches. Example:
cd code/projectdir/ git checkout -b feat/my-cool-feature # hack hack hack git add -p # add stuff git commit -m 'my cool new feature' git push # yay!
The problem arises if you git pull inside of a git submodule to update it to a particular commit. When you switch branches, the git submodule’s branch doesn’t move along with you! Personally, I think this is a bug, but perhaps it’s not. In any case, here’s the fix:
#!/bin/bash exec git submodule update
and then run:
chmod u+x <projectdir>/.git/hooks/post-checkout
and you’re good to go! Here’s an example:
[email protected]:~/code/puppet/puppet-gluster$ git checkout feat/yamldata M vagrant/gluster/puppet/modules/puppet Switched to branch 'feat/yamldata' Submodule path 'vagrant/gluster/puppet/modules/puppet': checked out 'f139d0b7cfe6d55c0848d0d338e19fe640a961f2' [email protected]:~/code/puppet/puppet-gluster (feat/yamldata)$ git checkout master M vagrant/gluster/puppet/modules/puppet Switched to branch 'master' Your branch is up-to-date with 'glusterforge/master'. Submodule path 'vagrant/gluster/puppet/modules/puppet': checked out '07ec49d1f67a498b31b4f164678a76c464e129c4' [email protected]:~/code/puppet/puppet-gluster$ cat .git/hooks/post-checkout #!/bin/bash exec git submodule update [email protected]:~/code/puppet/puppet-gluster$
Hope that helps you out too! If someone knows of a use-case when you don’t want this functionality, please let me know! Many thanks to #git for helping me solve this issue!