.git/hooks/pre-commit
(если его нет) и сделать его исполняемым (chmod +x .git/hooks/pre-commit
)..git/hooks/pre-commit
добавить скрипт, который будет запускать линтер и проверять код. Если линтер возвращает ошибки, скрипт должен завершиться с ненулевым кодом (например, exit 1
), чтобы предотвратить коммит. Пример:
#!/bin/sh
# Run linter
npx eslint .
# Check if there were any linting errors
if [ $? -ne 0 ]; then
echo "Linting failed. Please fix the errors before committing."
exit 1
fi
exit 0
Для автоматического запуска линтера перед каждым коммитом в Git можно использовать Git hooks, в частности, pre-commit
hook. Этот хук срабатывает непосредственно перед созданием коммита. Если он завершается с ненулевым кодом возврата (ошибка), коммит будет отменен.
Основные шаги:
.git/hooks
в вашем репозитории. Если ее нет, создайте её.
pre-commit
(без расширения) в директории .git/hooks
.
pre-commit
исполняемым. В терминале выполните:
chmod +x .git/hooks/pre-commit
pre-commit
и добавьте в него скрипт, который запускает ваш линтер. Пример:
Пример скрипта pre-commit
(для ESLint с npm):
#!/bin/sh
# Скрипт для запуска ESLint перед коммитом
# Запускаем ESLint для всех измененных JavaScript файлов
echo "Running ESLint..."
git diff --cached --name-only --diff-filter=ACM | grep '\.js$' | xargs -n 1 eslint
# Проверяем код возврата ESLint
if [ $? -ne 0 ]; then
echo "ESLint found errors. Please fix them before committing."
exit 1
fi
echo "ESLint passed successfully."
exit 0
Пояснения к примеру:
#!/bin/sh
: Указывает интерпретатор скрипта (bash).git diff --cached --name-only --diff-filter=ACM
: Получает список измененных файлов, подготовленных к коммиту. --cached
означает, что рассматриваются только проиндексированные (staged) изменения. --name-only
выводит только имена файлов. --diff-filter=ACM
фильтрует файлы по статусу (A - added, C - copied, M - modified).grep '\.js$'
: Фильтрует список, оставляя только файлы с расширением .js.xargs -n 1 eslint
: Передает каждый файл из списка аргументом в команду eslint
.if [ $? -ne 0 ]; then ... fi
: Проверяет код возврата последней команды (ESLint). Если код возврата не равен 0 (ошибка), выводится сообщение об ошибке и скрипт завершается с кодом 1, что отменяет коммит.Важно:
eslint
на команду prettier --write
или аналогичную.Пример использования Husky и lint-staged (рекомендуемый подход):
npm install husky lint-staged --save-dev
npx husky install
package.json
:
{
"scripts": {
"prepare": "husky install"
}
}
package.json
:
{
"lint-staged": {
"*.js": "eslint --fix" // Запускает ESLint и пытается автоматически исправить ошибки
}
}
.husky/pre-commit
:
#!/bin/sh
. "$(dirname "$0")/_/husky.sh"
npx lint-staged
Этот подход позволяет запускать линтер только для тех файлов, которые были изменены и подготовлены к коммиту, что значительно повышает производительность.
В заключение: Настройка запуска линтера перед коммитом помогает поддерживать консистентность и качество кода в репозитории. Выберите подходящий подход в зависимости от вашего проекта и потребностей.