Extending Git

As a follow-up to my cherry pick UI post, here’s a quick tutorial how you can extend Git with new sub-commands. If you used the cherry pick tool, you noticed that it is not very well integrated and you needed to remember the exact name of the script. I suggested to add an alias to your .gitconfig but there is more “natural” way to do it.

Luckily1, Git uses any program prefixed with git- and located in $PATH as a sub-command. That means, moving the pick-from to /usr/local/bin/git-pick, allows us to use it with

$ git pick <feature-branch>

Calling git pick --help spawns man for a git-pick.7 manpage. Hence, you could for example generate one from Markdown with Pandoc and copy that into your local man search directory ~/.local/share/man/man7.

Git’s sub-command completion is implemented in a similar pragmatic way: simply provide a bash function _git_command_name() that completes to whatever you like. Git already provides helper functions for typical situations, which is why we can complete branches for git pick simply with

function _git_pick () {
  __gitcomp_nl "$(__git_refs)"
  1. … and probably a reminiscence of Git’s past as a huge collection of porcelain Perl scripts around the Git core.