Conventional commit hooks are handy in a team environment where everyone must use a sensible commit message format to communicate and collaborate on a code base. The Conventional Commits specification is precisely defined for this purpose. It is a lightweight convention on top of commit messages. It provides an easy set of rules for creating an explicit commit history, which makes it easier to write automated tools on top.
Conventional Commit Hooks
cc-cli is a binary tool. It can be installed globally using the following cargo command:
> cargo install cc-cli
However, I prefer to install, cache and run such binary tools local to the repository. Therefore before I introduce
cc-cli, let us look at another tool called
cargo-run-bin. cargo-run-bin is a simple tool to build, cache, and run binaries scoped in Cargo.toml rather than installing globally. It acts similarly to npm run and gomodrun.
cargo-run-bin is the only tool that we need to install on the global level. Let’s install it:
> cargo install cargo-run-bin
cargo-run-bin creates a .bin directory and downloads, builds and caches the binaries in this directory. You can ignore this directory in the .gitignore.
Now let’s add
> cargo add cc-cli --dev
The tool will be added as a dev dependency in the
Now we can run this tool with the help of
cargo-run-bin using the following command:
> cargo bin cc-cli -i
cargo-run-bin will download the crate, build it, cache it, and then run
cc-cli as expected.
cc-cli -i will create a prepare-commit-msg hook in the .git/hooks directory. Here is what it looks like:
#!/bin/sh # cc-cli as a commit hook exec < /dev/tty cc-cli "$@"
However, it will fail as we run
cc-cli via cargo-run-bin. Therefore update the last line as shown below:
cargo bin cc-cli "$@"
So far, so good. However, it will be local to my repository. That’s because we prefer to share these hooks among the team. By default, the hooks directory is
$GIT_DIR/hooks, but that can be changed via the core.hooksPath configuration variable.
Let’s create a .git-hooks directory in the root directory and make it the hooks directory:
> git config core.hooksPath .git-hooks
The above will set the .git-hooks as the hooks directory for the repository.
Now move all the hooks files from the
$GIT_DIR/hooks to .git-hooks directory and commit them in the git repo.
We are now all set to use conventional commit across the team.