Git Workflow и Husky
Описание Git workflow, автоматизированных проверок (hooks) и процесса коммитов.
Обзор
Проект использует Husky для автоматизации проверок перед коммитами и пушами. Это обеспечивает консистентность кода и предотвращает попадание ошибок в репозиторий.
flowchart LR
A["Редактирование кода"] --> B["git add"]
B --> C["git commit"]
C --> D["pre-commit hook"]
D -->|Ошибки| E["Исправить и повторить"]
D -->|OK| F["Коммит создан"]
F --> G["git push"]
G --> H["pre-push hook"]
H -->|Ошибки| I["Исправить и повторить"]
H -->|OK| J["Push успешен"]Pre-Commit Hook
Выполняется при git commit, проверяет и модифицирует staged файлы.
Этапы
# 1. Удаление комментариев
npm run removeComments:stagedУдаляет все комментарии из TypeScript файлов перед коммитом.
# 2. Удаление return types
npm run removeReturnTypes:stagedУдаляет явные типы возвращаемых значений (TypeScript сам выведет).
# 3. Форматирование Prettier
npx pretty-quick --stagedПереформатирует staged файлы согласно Prettier конфигурации.
# 4. ESLint проверка
npx lint-stagedЗапускает ESLint на staged файлах и автоматически исправляет возможные ошибки.
Пример выполнения
$ git commit -m "feat: add new feature"
# Husky запускает pre-commit hook...
npm run removeComments:staged # ✓
npm run removeReturnTypes:staged # ✓
npx pretty-quick --staged # ✓
npx lint-staged # ✓
# Коммит создан успешно!Если ошибки
$ git commit -m "feat: add new feature"
# ...
npx lint-staged
# ✘ ESLint ошибка на lines 10-15
# Автоматическое исправление...
# ✓ Исправлено
# Вам нужно добавить изменения и повторить коммит
$ git add .
$ git commit -m "feat: add new feature"
# ... теперь OKPre-Push Hook
Выполняется при git push, проверяет всё приложение перед отправкой.
Этапы
# 1. TypeScript проверка типов
npm run typecheckПроверяет все TypeScript файлы на ошибки типизации.
# 2. ESLint полная проверка
npm run lintПолная проверка всего кода ESLint (не только staged файлы).
# 3. Тестовая сборка
npm run build:devПроверяет, что приложение собирается без ошибок.
Пример выполнения
$ git push origin feature-branch
echo "Running pre-push checks..."
echo "TypeScript type check..."
npm run typecheck # ✓
echo "Linting code..."
npm run lint # ✓
echo "Testing build..."
npm run build:dev # ✓
echo "All checks passed!"
# Push успешен!Если ошибки
$ git push origin feature-branch
echo "Running pre-push checks..."
echo "TypeScript type check..."
npm run typecheck # ✘ Error TS2322 on line 45
# Push отменен!
# Исправьте ошибку, коммитьте и повторите pushКонфигурация Husky
Инициализация
# Первый раз (при клонировании)
npm run prepare # Инициализирует HuskyСтруктура
.husky/
├── _/ # Внутренние файлы Husky
├── pre-commit # Pre-commit hook
└── pre-push # Pre-push hookPre-commit файл
#!/bin/sh
npm run removeComments:staged
npm run removeReturnTypes:staged
npx pretty-quick --staged
npx lint-stagedPre-push файл
#!/bin/sh
echo "Running pre-push checks..."
echo "TypeScript type check..."
npm run typecheck || exit 1
echo "Linting code..."
npm run lint || exit 1
echo "Testing build..."
npm run build:dev || exit 1
echo "All checks passed!"Workflow разработчика
1. Создание фичи
git checkout -b feature/my-feature2. Редактирование кода
# Редактируете файлы...
code src/app/users/users.service.ts
# Проверка локально
npm start
# Проверка линтера
npm run lint:fix3. Коммит
git add .
git commit -m "feat: add user activation"
# Husky автоматически:
# ✓ Удалит комментарии
# ✓ Удалит return types
# ✓ Переформатирует (Prettier)
# ✓ Проверит ESLint
# ✓ Создаст коммит
# Если ошибки - исправьте и повторите:
# git add .
# git commit -m "feat: add user activation"4. Push
git push origin feature/my-feature
# Husky автоматически:
# ✓ Проверит TypeScript
# ✓ Запустит ESLint на всем коде
# ✓ Соберет приложение
# ✓ Отправит на сервер
# Если ошибки - исправьте локально:
# npm run lint:fix
# npm run typecheck
# git add .
# git commit -m "fix: resolve linting issues"
# git push origin feature/my-feature5. Pull Request
После push можно создать Pull Request в GitHub/GitLab.
Полезные команды
Пропустить hook (НЕ рекомендуется!)
# Пропустить pre-commit
git commit --no-verify -m "feat: skip checks"
# Пропустить pre-push
git push --no-verifyИсправление последнего коммита
# Добавить изменения в последний коммит
git add .
git commit --amend --no-edit
# Изменить сообщение коммита
git commit --amend -m "feat: new message"Просмотр истории
# Логмосмотр со всеми деталями
git log --oneline --graph --all
# Показать последние 10 коммитов
git log -10Troubleshooting
Husky не запускается
Проблема: Hooks не выполняются при коммите
Решение:
# Переинициализировать Husky
npm run prepare
# Или явно включить permissions
chmod +x .husky/pre-commit
chmod +x .husky/pre-pushESLint ошибки не исправляются
Проблема: lint-staged не может автоматически исправить
Решение:
# Исправить вручную
npm run lint:fix
# Добавить и повторить коммит
git add .
git commit -m "feat: fix linting issues"TypeScript ошибки при pre-push
Проблема: Push отменяется из-за типов
Решение:
# Проверить ошибки
npm run typecheck
# Исправить их в коде
# Коммитить исправления
git add .
git commit -m "fix: resolve TypeScript errors"
# Повторить push
git push origin feature-branchBuild ошибки при pre-push
Проблема: npm run build:dev падает
Решение:
# Локально протестировать сборку
npm run build:dev
# Исправить ошибки
# Коммитить исправления
git add .
git commit -m "fix: resolve build errors"
# Повторить push
git push origin feature-branchBest Practices
✅ Правильно
- Регулярные коммиты - Коммитьте часто, небольшие логичные chunks
- Описательные сообщения -
feat: add user authвместоupdate code - Исправляйте локально - Запускайте
npm run lint:fixперед коммитом - Уважайте hooks - Не пропускайте их с
--no-verify
❌ Неправильно
- Большие коммиты - Избегайте коммитов с 100+ изменениями
- Неясные сообщения -
fixилиupdateбез деталей - Пропуск проверок -
git commit --no-verify - Игнорирование ошибок - Не исправляйте ошибки ESLint/TypeScript
Commit Message Format
Рекомендуемый формат:
<type>(<scope>): <subject>
<body>
<footer>Типы
feat- Новая фичаfix- Исправление багаdocs- Документацияstyle- Форматирование, отсутствующие точки с запятой и т.д.refactor- Рефакторинг кодаperf- Улучшение производительностиtest- Добавление или обновление тестовchore- Изменения конфигурации, зависимостей
Примеры
feat(auth): add JWT token refresh mechanism
Implement automatic token refresh when token expires.
Adds refresh_token to login response.
Closes #123fix(integrations): handle network timeout in gateway service
Previously gateway service would hang indefinitely on network timeout.
Now properly catches timeout errors and returns null.docs(architecture): update module documentation
Updated modules.md with current architecture.
Added business logic flows.Следующие шаги
- Линтинг - ESLint и Prettier конфигурация
- Тестирование - Jest и написание тестов
- Правила кода - Стандарты написания кода