DEV Community

Cover image for Como adicionar pre-commit no Git
Alexandre Liberato
Alexandre Liberato

Posted on

Como adicionar pre-commit no Git

Tendo uma verificação de pre-commit evitamos enviar código com warnings de lint, erros de teste e outros para o PR:

Baixar o arquivo abaixo e colocar no diretório 'hooks' do seu repositório:

$ cd project-repo-directory
$ cp ~/Downloads/pre-commit .git/hooks/
$ git add .
$ git commit -m 'xxx'
Enter fullscreen mode Exit fullscreen mode

Quando ele detecta um erro no teste ou lint ele para e não commita.

A linha 9 é um comando usado para verificar os lints localmente.
Na linha 12 para funcionar vc precisa instalar o gotestsum, que acho mais ágil para ler os erros, ou trocar a linha dessa ferramenta para 'make test' ou o comando que você utiliza pra seus testes unitários.

pre-commit

#!/bin/sh
#
# An example hook script to verify what is about to be committed.
# Called by "git commit" with no arguments.  The hook should
# exit with non-zero status after issuing an appropriate message if
# it wants to stop the commit.
#
# To enable this hook, rename this file to "pre-commit".
make metalint
exit $?
​
gotestsum --format pkgname --  -race ./...
exit $?
​
​
if git rev-parse --verify HEAD >/dev/null 2>&1
then
    against=HEAD
else
    # Initial commit: diff against an empty tree object
    against=$(git hash-object -t tree /dev/null)
fi
​
# If you want to allow non-ASCII filenames set this variable to true.
allownonascii=$(git config --bool hooks.allownonascii)
​
# Redirect output to stderr.
exec 1>&2
​
# Cross platform projects tend to avoid non-ASCII filenames; prevent
# them from being added to the repository. We exploit the fact that the
# printable range starts at the space character and ends with tilde.
if [ "$allownonascii" != "true" ] &&
    # Note that the use of brackets around a tr range is ok here, (it's
    # even required, for portability to Solaris 10's /usr/bin/tr), since
​
    # the square bracket bytes happen to fall in the designated range.
    test $(git diff --cached --name-only --diff-filter=A -z $against |
      LC_ALL=C tr -d '[ -~]\0' | wc -c) != 0
then
    cat <<\EOF
Error: Attempt to add a non-ASCII file name.
​
This can cause problems if you want to work with people on other platforms.
​
To be portable it is advisable to rename the file.
​
If you know what you are doing you can disable this check using:
​
  git config hooks.allownonascii true
EOF
    exit 1
fi
​
# If there are whitespace errors, print the offending file names and fail.
exec git diff-index --check --cached $against --
Enter fullscreen mode Exit fullscreen mode

Oldest comments (0)