Lefthook Как навести порядок в Git-хуках и ускорить разработку

29 Jun, 2026
8,477
🔱 275
👥 27

Знакомая ситуация? Вы работаете в команде, где каждый разработчик настраивает линтеры, форматтеры и тесты по-своему. В итоге в репозиторий попадает код, который не соответствует общим стандартам, а ревью превращается в бесконечную правку стилистических ошибок. Или, что еще хуже, кто-то забыл запустить тесты, и CI/CD падает.

Git-хуки — это мощный инструмент для автоматизации проверок и действий перед коммитом, пушем или во время других событий Git. Но управлять ими вручную, особенно в больших проектах или командах, может быть настоящей головной болью. Тут на помощь приходит Lefthook — элегантное и производительное решение от команды Evil Martians, которое превращает хаос в порядок.

Lefthook logo

Что такое Lefthook и зачем он нужен?

Представьте, что у вас есть швейцарский армейский нож для ваших Git-хуков. Именно таким инструментом и является Lefthook. Это не просто обертка над стандартными хуками, а полноценный менеджер, написанный на Go, что сразу намекает на его скорость и минимальные зависимости. Он позволяет централизованно управлять всеми пред-коммит, пред-пуш и другими хуками в вашем проекте, обеспечивая единообразие и автоматизацию.

Кому это будет полезно? Да практически любой команде разработчиков!

Реклама
  • Фронтендерам, чтобы автоматически запускать ESLint, Prettier, Stylelint.
  • Бэкендерам на Ruby, Python, Go, чтобы проверять код линтерами, запускать юнит-тесты.
  • DevOps-инженерам, чтобы валидировать конфигурационные файлы или скрипты.
  • Всем, кто хочет избежать "ой, я забыл запустить линтер" или "у меня на машине работает, а на CI нет".

Lefthook берет на себя рутину, позволяя вам сосредоточиться на написании кода, а не на его форматировании или поиске забытых ошибок.

Ключевые возможности, которые меняют игру

Lefthook не просто запускает команды. Он делает это умно, быстро и гибко. Давайте посмотрим на несколько фич, которые выделяют его среди других решений.

1. Скорость — залог продуктивности

Одна из самых раздражающих вещей в хуках — это их медлительность. Ждать по несколько секунд или даже минут, пока прогонятся все линтеры и тесты, прежде чем сделать коммит, — то еще удовольствие. Lefthook решает эту проблему благодаря двум вещам:

  • Написан на Go: Это означает высокую производительность и минимальное потребление ресурсов.
  • Параллельное выполнение: Вы можете настроить хуки так, чтобы они запускались одновременно, а не последовательно.

Представьте: у вас есть линтер для JS, линтер для CSS и тесты. Зачем ждать, пока один завершится, чтобы начать другой? Lefthook позволяет указать в lefthook.yml:

pre-push:
  parallel: true
  jobs:
    - name: lint frontend
      run: yarn eslint {staged_files}
    - name: stylelint frontend
      run: yarn stylelint {staged_files}
    - name: run tests
      run: yarn test

И все эти задачи полетят одновременно! Это значительно сокращает время ожидания и делает процесс коммита или пуша гораздо приятнее.

2. Гибкое управление файлами и фильтрация

Часто нам нужно запускать команды только для определенных файлов или исключать некоторые из них. Lefthook предоставляет мощные механизмы для этого:

  • Различные списки файлов: Вы можете работать только с staged_files (файлы в стейджинге), all_files (все файлы в репозитории) или даже git diff --name-only HEAD @{push} (файлы, которые будут отправлены при пуше).
  • Glob и Regexp фильтры: Нужно запустить Rubocop только для Ruby-файлов, но исключить миграции? Легко!
pre-commit:
  jobs:
    - name: lint backend
      glob: "*.rb" # glob-фильтр для Ruby-файлов
      exclude:
        - "db/migrate/*.rb" # исключаем миграции
      run: bundle exec rubocop --force-exclusion {all_files}

    - name: lint frontend
      files: git diff --name-only HEAD @{push} # берем файлы из последнего пуша
      glob: "*.{js,jsx,ts,tsx}" # только JS/TS файлы
      run: yarn eslint {files}

Такая детализация позволяет создавать очень точные и эффективные хуки, которые не тратят время на проверку ненужных файлов.

3. Поддержка Docker и выполнение скриптов

Работаете в Docker-контейнерах? Lefthook не оставит вас в беде. Вы можете запускать команды прямо внутри вашего контейнера, что гарантирует идентичность окружения для всех разработчиков и CI/CD.

pre-commit:
  jobs:
    - script: "good_job.js" # Можно запускать внешние скрипты
      runner: docker run -it --rm <container_id_or_name> {cmd} # Запускаем через Docker

А если одной команды в строке недостаточно, можно указать путь к скрипту, который будет выполнен. Это дает огромную свободу для реализации сложной логики.

4. Локальные конфиги и теги для командной работы

В больших командах или монорепозиториях часто возникает потребность в гибкой настройке хуков. Например, фронтенд-разработчику не нужны все бэкенд-проверки, и наоборот. Lefthook предлагает элегантное решение:

  • Теги: Вы можете помечать задачи тегами (frontend, backend, security).
  • Локальные конфиги (lefthook-local.yml): Каждый разработчик может создать файл lefthook-local.yml, чтобы переопределить или пропустить определенные хуки или теги.
# lefthook.yml (общий конфиг)
pre-push:
  jobs:
    - name: audit packages
      tags:
        - frontend
        - linters
      run: yarn lint

    - name: audit gems
      tags:
        - backend
        - security
      run: bundle audit

# lefthook-local.yml (локальный конфиг фронтендера)
pre-push:
  exclude_tags:
    - backend # Пропускаем все бэкенд-проверки
  jobs:
    - name: audit packages
      skip: true # Пропускаем конкретную задачу

Это позволяет командам сохранять общий стандарт, но при этом давать разработчикам возможность адаптировать процесс под свои нужды, не затрагивая основной конфиг.

Установка и начало работы

Начать работать с Lefthook удивительно просто, благодаря его бинарной природе и отсутствию зависимостей.

  1. Установка: Выберите удобный для вас способ:

    • Go: go install github.com/evilmartians/lefthook/v2@v2.0.12
    • NPM: npm install lefthook --save-dev
    • Ruby: gem install lefthook
    • Python: pipx install lefthook
    • Или через Homebrew, apt, winget и другие пакетные менеджеры.
  2. Конфигурация: Создайте файл lefthook.yml в корне вашего проекта и опишите свои хуки.

    # lefthook.yml
    pre-commit:
      commands:
        eslint:
          run: yarn eslint {staged_files}
        prettier:
          run: yarn prettier --write {staged_files}
    
  3. Установка хуков: Выполните команду в терминале:

    lefthook install
    

    Lefthook создаст необходимые файлы в .git/hooks, которые будут ссылаться на его бинарник.

  4. Наслаждайтесь: Теперь при каждом git commit или git push ваши хуки будут автоматически запускаться.

Выводы: Стоит ли Lefthook вашего внимания?

Однозначно да! Если вы ищете способ:

  • Улучшить качество кода в вашей команде.
  • Автоматизировать рутинные проверки и форматирование.
  • Ускорить циклы разработки, сократив время ожидания хуков.
  • Обеспечить единообразие окружения для всех разработчиков.
  • Получить гибкий и мощный инструмент, который легко интегрируется в любой проект.

Lefthook — это зрелое, хорошо документированное и активно развивающееся решение. Его простота в установке, высокая производительность и богатый набор функций делают его одним из лучших менеджеров Git-хуков на сегодняшний день. Попробуйте, и вы, скорее всего, забудете о других инструментах для этой задачи. Evil Martians в очередной раз показали, как можно сделать сложную вещь простой и эффективной.


P.S. Не забудьте заглянуть в официальную документацию Lefthook, там вы найдете еще больше примеров и продвинутых настроек.

🍪 Мы используем файлы cookie и сервис аналитики Яндекс.Метрика, чтобы сайт работал лучше. Продолжая пользоваться devtrends.ru, вы соглашаетесь с обработкой данных согласно Политике конфиденциальности.