Оригинальная статья: https://www.ethancarlsson.dev/blog/githooks
Если вы хотите настроить простой способ запуска
код перед каждым коммитом в pre-commit
хуке для
проекта Javascript, то вот как я это сделал.
Настройка
На самом деле хуки не зависят ни от чего, кроме git, но
В этом проекте я использую vite
и yarn
.
Это будет работать одинаково с любым инструментом сборки,
а если вы используете npm
, просто замените yarn [command]
на npm run [command]
.
Чтобы хук сработал, вам нужно написать этот код в разделе
Итак, для начала работы введите в терминал один из следующих кодов
терминале из корня вашего проекта:
Для vim: vim .git/hooks/pre-commit
.
Для nano: nano .git/hooks/pre-commit
Для VS Code: code .git/hooks/pre-commit
.
Или создайте и отредактируйте файл любым другим способом, который вам нравится.
Код
#!/bin/bash
yarn lint
linting_result=$?
if [[ $linting_result -ne 0 ]]
then
echo "LINT FAILED!"
echo 'Please fix linting problems before committing.'
exit 1
fi
yarn test
test_result=$?
if [[ $test_result -ne 0 ]]
then
echo "TESTS FAILED!"
echo 'Please make sure tests pass before committing.'
exit 1
fi
Команды yarn test
и yarn lint
работают точно так же, как и
когда они вызываются из командной строки в корне моего проекта.
Я получаю код выхода и проверяю, равен ли он нулю:
linting_result=$?
if [[ $linting_result -ne 0 ]]
Если он не равен 0 (-ne 0
), я выдаю эхом сообщение
и выхожу из кода bash с другим ненулевым кодом выхода,
then
echo "LINT FAILED!"
echo 'Please fix linting problems before committing.'
exit 1
fi
Если либо тесты, либо линтер не работают, они выходят
с кодом 1. Но если он завершается с другим кодом.
Я хотел бы знать почему, поэтому я выхожу с любым ненулевым кодом и не
позволяю коммиту идти дальше.
Следующие шаги
Все, что вам теперь нужно сделать, это запустить chmod +x .git/hooks/pre-commit
, чтобы сделать код исполняемым,
и код будет выполняться при каждом коммите.
Ознакомьтесь с документацией и добавьте
любые другие хуки, которые вам нравятся. Я запускаю тот же код и при push, используя
крючок pre-push
, например