Working with git submodules: tips ‘n tricks
Some people hate it, nobody loves it, but it’s a good way to split codebase in different components/repositories.
I have been using submodules a LOT for puppet development (all those puppet modules…). Some people might propose alternatives (puppet-tree, librarian), but I rather stick with what I already know.
Dealing with submodules in git is mainly painful because the parent repository doesn’t really know/care what is inside the submodule. He only keeps track of the hash that links the commit. Another downside is that your submodules mostly always end up in a detached state and after checking out a branch, you kinda forget on what commit the parent repository has.
You can put them in your ~/.gitconfig file in the alias section:
git tags
Little different from the default git tag: Uses sort to do natural sort with version numbers. Note, your sort version must be new enough.
tags = !sh -c 'git tag | sort -V'
git update
Run in the root of the ‘parent’ repository
update = !sh -c 'git pull && git fetch --tags && git submodule update --recursive && git submodule foreach git tag -f parent-$(git describe --contains --all HEAD)'
- Pull from the remote
- Fetch remote tags
- Update submodules (recursive)
- Create a tag on each submodule called parent-BRANCH with BRANCH being the branch the current parent repository is on
git noparent
Removes the parent-* tags from all repositories (recursive).
noparent = !sh -c 'git tag -d $(git tag | grep ^parent ) && git submodule foreach git noparent'
- Remove all tags matching ^parent
- Do the same for each submodule (recursive)
git safepush
Remove parent tags, make sure we don’t create a merge commit and push.
safepush = !sh -c 'git noparent && git pull --rebase && git push && git push --tags'
- Remove parent tags, we don’t want to push them by accident
- Fetch remote changes and rebase
- Push push push!
git pushtags
Remove parent tags and push all the tags.
pushtags = !sh -c 'git noparent && git push --tags'
- Remove the parent tags we have set
- Push tags