We\'d like to make a few basic hook scripts that we can all share -- for things like pre-formatting commit messages. Git has hook scripts for that that are normally stored
Ideally, hooks are written in bash, if you follow the sample files. But you can write it in any language available, and just make sure it has the executable flag.
So, you can write a Python or Go code to achieve your goals, and place it under the hooks folder. It will work, but it will not be managed along with the repository.
Two Options
a) Multi Scripts
You can code your hooks inside your help, and add a small fragment of code to hooks, to call your perfect script, like this:
$ cat .git/hooks/pre-commit
#!/bin/bash
../../hooks/myprecommit.js
b) Single Script
A cooler option is to add just one script to rule them all, instead of several ones. So, you create an hooks/mysuperhook.go and point every hook you wanna have to it.
$ cat .git/hooks/pre-commit
#!/bin/bash
../../hooks/mysuperhook.go $(basename $0)
The parameter will provide your script which hook was triggered, and you can differentiate it inside your code. Why? Sometimes you might wanna run the same check for commit and push, for instance.
And then?
Then, you might want to have further functionalities, like:
Can this be simpler?
Yes, there are several tools to help you manage git-hooks. Each of them is tailored to tackle the problem from a different perspective, and you might need to understand all of them to get the one which is best for you or your team. GitHooks.com offers a lot of reading about hooking, and several tools available today.
As of today, there are 21 projects listed there with different strategies to manage git hooks. Some only do it for a single hook, some for a specific language, and so on.
One of those tools, written by me and offered for free as an opensource project, is called hooks4git. It is written in Python (because I like it) but the idea is to handle all items listed above in a single configuration file called .hooks4git.ini, which lives inside your repository and can call any script you want to call, in any language.
Using git hooks is absolutely fantastic, but the way they are offered usually only gets people away from it.
Theoretically, you could create a hooks
directory (or whatever name you prefer) in your project directory with all the scripts, and then symlink them in .git/hooks
. Of course, each person who cloned the repo would have to set up these symlinks (although you could get really fancy and have a deploy script that the cloner could run to set them up semi-automatically).
To do the symlink on *nix, all you need to do is:
root="$(pwd)"
ln -s "$root/hooks" "$root/.git/hooks"
use ln -sf
if you're ready to overwrite what's in .git/hooks
How about git-hooks, it route .git/hooks
invoke into script under project directory githooks
.
There are also lot of features to enable you minimize copy and symlink hook all over the place.
You could use a managed solution for pre-commit hook management like pre-commit. Or a centralized solution for server-side git-hooks like Datree.io. It has built-in policies like:
It won't replace all of your hooks, but it might help your developers with the most obvious ones without the configuration hell of installing the hooks on every developers computer/repo.
Disclaimer: I am one of Datrees founders
We are using Visual Studio solutions (and thus projects) which have pre and post build events. I'm adding an additional project named 'GitHookDeployer'. The project self modifies a file in the post build event. That file is set to copy to the build directory. Thus the project is build every time and is never skipped. In the build event, it also makes sure that all git hooks are in place.
Note that this is not a general solution, as some projects, of course, have nothing to build.