Git hooks are often overlooked or underused. They can be very useful, and even used as a rudimentary CI/CD workflow.
While these tips can work for any repo, this could be viewed as an expansion on my tech_grimoire post.
For note taking I make use of the VimWiki plugin to Vim. My wiki directory is a git repository, which is then cloned on to one of my servers and using Gollum is available as a website.
This has worked well for years, but one thing I have not been good at is committing and pushing changes straight away. In order to improve my workflow I make use of two git hooks, one in the local repo and one in the remote bare repo.
Git hooks are scripts which can be run at various times in a git workflow. When they run is based on the name of the script.
If you look in the .git/hooks directory of a repo you should see some sample scripts.
──── ─ ls -1 .git/hooks applypatch-msg.sample commit-msg.sample fsmonitor-watchman.sample post-update.sample pre-applypatch.sample pre-commit.sample pre-merge-commit.sample pre-push.sample pre-rebase.sample pre-receive.sample prepare-commit-msg.sample push-to-checkout.sample update.sample
For my wiki I make of the
#!/bin/sh git push origin master
That’s it. As soon as I make a commit the master branch is automatically pushed.
This works but I wanted to go one step further, automatically adding changed files and making the commit. The
prepare-commit-msg hook is useful when you want to populate the commit message with something, but I couldn’t figure out an easy way to do what I wanted with hooks.
In the end I used a command in my ~/.vimrc
set :Gac git commit -a -m "updates"
Now, when I have finished updating my wiki I incant
and the updates will be committed and pushed, albeit with a generic commit message.
Once the changes are pushed to my git server they hit another hook,
#!/bin/sh ssh wikiserver "cd /grimoire ; git pull"
When the remote bare repo receives any updates the hook will perform a
git pull of my wiki on the server I host it on, causing my Gollum page to be updated.
The final thing I have done is to change the hooks directory in my local repo. With the default dir, .git/hooks, nothing can be tracked by git.
Instead I created a directory in the repo, .githooks and put my
post-commit hook there. This way it can be tracked in the repo.
An update to the config is required so git knows where the hooks are
git config core.hooksPath .githooks
Note: this option was introduced in got v2.9, so make sure you have that version or higher
As far as I am aware there is no way to track hooks in a remote bare repo. If you know of a way I would be interested to hear about it.
Who needs a convoluted CI/CD pipeline when a couple of one line scripts will do? Typing
:Gac is easy enough that my wiki should now stay up to date.