Git hooks are scripts that run automatically every time a particular event occurs in a Git repository (e.g.
$ git commit,
$ git push, etc.).
Git pre-commit example
1. Open .git/hooks dir
By default, every Git repo has a .git/hooks directory (a hidden folder).
2. Rename pre-commit.sample
pre-commit.sample file name to
pre-commit (by removing .sample). If you'd like to enable another hook, apply the same change to it.
3. Add script to pre-commit hook
In order to run the following script properly, you will need to install jq: https\://stedolan.github.io/jq/download/
Copy-paste the following code into your pre-commit file:
# Grep all yaml files that are part of the commit
YAML_STAGED_FILES=$(git diff --cached --name-only --diff-filter=ACM | grep ".ya\?ml\$")
if [ "$YAML_STAGED_FILES" = "" ]; then
# K8s yaml validation
if [ ! "$YAML_STAGED_FILES" = "" ]; then
echo -e "$(tput setaf 7)$(tput bold)INFO: $(tput init)Validating K8s files with Datree..."
for YAML_FILE in $YAML_STAGED_FILES
# Skip yaml files that are not k8s files
apiVersionResult="$(yq e '.apiVersion' "$YAML_FILE")"
kindResult="$(yq e '.kind' "$YAML_FILE")"
if [ "$apiVersionResult" = "null" ] && [ "$kindResult" = "null" ]; then
echo -e "$(tput setaf 3)$(tput bold)WARNING: $(tput init)Could not find a 'kind' or 'apiVersion' attribute in $YAML_FILE, skipping..."
# Run datree on all the other yaml files
if datree test "$YAML_FILE"; then
echo -e "$(tput setaf 2)$(tput bold)Datree Passed: $(tput init)$YAML_FILE"
echo -e "$(tput setaf 1)$(tput bold)Datree Failed: $(tput init)$YAML_FILE"
# Exit and give status
if [ "$YAML_PASS" = "false" ]; then
echo -e "$(tput setaf 1)$(tput bold)ERROR: $(tput init)Your commit contains files that failed Datree tests. Please fix the errors and try again."
echo -e "\n$(tput setaf 2)$(tput bold)COMMIT SUCCEEDED$(tput init)"
4. Test your hook
Make a change in a Kubernetes yaml file and make a commit. The bash script will look for all the yaml files that have been committed and will run
datree test [yaml file] on each of them.