git-flow-hooks
Some useful hooks for git-flow (AVH Edition).
What does it do?
- Prevent direct commits to the master branch.
- Prevent merge marker commits.
- Automatically bump versions when starting a release or hotfix. Versions are generated, written to file and committed.
- Automatically specify tag messages.
Usage
Install
Clone this repository somewhere on your disk.
git clone [email protected]:jaspernbrouwer/git-flow-hooks.git
Whenever your read /path/to/git-flow-hooks
, replace it with the actual path to your clone/working copy.
OS X
OS X doesn't support sort -V
, which is used to sort git tags by version number, which in turn is needed to correctly bump versions.
On OS X you can install coreutils (using MacPorts or Homebrew), after which gsort -V
can be used.
If it's located at /opt/local/bin/gsort
or /usr/local/bin/gsort
we will pick it up automatically.
Otherwise we fall back to /usr/bin/sort
.
Optionally you can use the configuration option VERSION_SORT
to point to a different command.
Activate
Initialize git-flow.
git flow init
It will ask you some questions, the last will be Hooks and filters directory?
, which you can answer with /path/to/git-flow-hooks
.
If you've already initialized git-flow, you can still set/change the path manually.
git config gitflow.path.hooks /path/to/git-flow-hooks
Prevention hooks
The hooks that prevent direct commits to the master branch, and prevent merge marker commits, are pre-commit
hooks.
These only function if they're located in the .git/hooks
directory of your working copy.
In other words, after activating like described above, these hooks still won't kick in.
I see 2 options:
- In stead of activating like described above, remove the
.git/hooks
directory and make it a symbolic link (ln -s /path/to/git-flow-hooks .git/hooks
). - Create a symbolic link to the
pre-commit
file (ln -s /path/to/git-flow-hooks/pre-commit .git/hooks/pre-commit
).
If you know a better way to use the pre-commit
hooks, please let me know by opening an issue!
Update
Simply pull any updates from origin.
cd /path/to/git-flow-hooks
git pull
That's it, all your repositories that have git-flow initialized and use /path/to/git-flow-hooks
as hooks and filters directory will be up-to-date.
Configuration
This is completely optional!
Global
Copy the file /path/to/git-flow-hooks/modules/git-flow-hooks-config.sh.dist
to /path/to/git-flow-hooks/git-flow-hooks-config.sh
(hooks directory) and change whatever you like.
Local
Copy the file /path/to/git-flow-hooks/modules/git-flow-hooks-config.sh.dist
to .git/git-flow-hooks-config.sh
(repository root) and change whatever you like.
Any settings in the local configuration file will override settings in the global one. So remove settings you don't want to override.
git-flow
git-flow (AVH Edition) has some useful configuration options too.
See its wiki for a complete list.
Or you can type git flow <command> [<subcommand>] --help
.
Starting releases and hotfixes
If git flow release start
and git flow hotfix start
are run without a version, the version will be bumped automatically.
Releases will be bumped at the minor level (1.2.3
becomes 1.3.0
), hotfixes at the patch level (1.2.3
becomes 1.2.4
).
The hooks will look at the git tags to find the version to bump.
If no tags are found, it looks for the version-file.
If that isn't found, it assumes the current version is 0.0.0
.
Alternatively you may use patch
, minor
and major
as version.
A bump of that level will take place.
If the commands are run with version, that version will be used (no bumping).
Bump messages
git-flow-hooks bumps the version in a commit with the message "Bump version to %version%".
If you want to use a different message, you can change it in the git-flow-hooks configuration.
Automatic tag messages
If you want tag messages to be automated (you won't be bothered with your editor to specify it), use the following configuration options:
git config gitflow.hotfix.finish.message "Hotfix %tag%"
git config gitflow.release.finish.message "Release %tag%"
If you like, you can change the tag-placeholder (%tag%
in the example above) in the git-flow-hooks configuration.
Plugins
We want to create a plugin-like structure where users can add functionality in a more uniform way. Unfortunately, that would take some time and testing to implement.
While it's in progress, you can try to use the following forks:
License
git-flow-hooks is published under The MIT License, see the LICENSE file.
Note that these hooks are built for git-flow (AVH Edition) by Peter van der Does, which has its own licenses.
The scripts for preventing master and merge marker commits are based on git-hooks by Sitebase.