Цифровой садик - приветственная

Цифровой садик - приветственная | Полный список всего, что тут есть | RSS | Подписаться через follow.it

17.04.2025

pre-commit

Так-то хуки в git довольно просто настраиваются и руками. Для pre-commit — завести исполняемый файлик pre-commit в .git/hooks.

Но если хочется делиться конфигурацией хуков и вообще хранить их в проекте явно – есть инструменты.

Питонячный pre-commit

  • https://pre-commit.com
  • .pre-commit-config.yaml - конфиг. Располагается прямо в корне репозитория. Для vale, например, такой (не совпадает с моим актуальным, потому что следы былого рабочего):

    default_stages: [pre-commit, pre-push]
    repos:
      - repo: local
        hooks:
        - id: vale-md
          name: vale-md
          entry: vale
          language: system
          types: ["file", "text", "markdown"]
          verbose: true
        - id: vale-dita
          name: vale-dita
          entry: vale --ignore-syntax
          language: system
          types: ["file", "non-executable", "text"]
          files: \.(dita|ditamap)$
          verbose: true
        - id: vale-all
          name: vale
          entry: vale
          language: system
          types: ["text"]
          exclude: \.(dita|ditamap|md)$
          verbose: true
    

    Cмыслы тут:

    • verbose: true — потому что иначе всё, что не error, фиг увидишь, а что error — фиг закоммитишь, пока не исправишь. Ну, или только с помощью флага `–no-verify`, но это некрасиво. Так-то мне чаще актуальны warning или suggestion — в смысле, убедись, что тут не косяк, или глянь, не лучше ли иначе. Но если глянула и это ок — коммитить можно.
    • маркдаун vale проверит с учётом того, что это маркдаун.
    • dita — у меня нет понятного для vale способа работать с dita «как надо», поэтому игнор синтаксиса нужен, чтобы не жаловалось.
    • Остальные похожие на текстовые — как vale захочет. Пусть жалуется, если что, разберёмся.
    • Для нетекстового у меня проверок нет. Других проверок тоже пока нет.

    Есть полезность identify-cli <file> — способ понять, что писать в types для таких файлов.

  • pre-commit install – выполнить в репозитории, чтобы хук завёлся. После этого при желании можно:
    • pre-commit run –-all-files – выполнить хук на всех существующих файлах. Осторожно! Например, vale у меня на больших файлах может очень долго отрабатывать и насыпать безумное количество результатов. От мысли натравить разом на все файлы мне страшно становится. :)
    • pre-commit run — выполнить только на изменённых и застейдженных файлах и посмотреть, работает ли. Это должно срабатывать так же, как «само» по событию commit.
  • https://pre-commit.com/hooks.html - мега-список уже готовых хуков.
  • https://verdantfox.com/blog/view/how-to-use-git-pre-commit-hooks-the-hard-way-and-the-easy-way - сильно помогло въехать.

Pre-commit не умеет скармливать указанной в конфиге в описании хука команде файлы поштучно. Просто не умеет. https://github.com/pre-commit/pre-commit/issues/394 — здесь есть ряд предложений по решению. В целом на основе echo $@ | xargs -n1 ваша_команда, в смысле, «напечатай всё, скорми это xargs, которая в свою очередь передаст это вашей команде поштучно.

Альтернатив для node.js

https://www.npmjs.com/search?page=0&q=keywords%3Apre-commit&sortBy=downloads_monthly

Кажется, популярна штука, именуемая husky. Относительно минималистичная альтернатива – https://www.npmjs.com/package/simple-git-hooks. Промежуточное – https://www.npmjs.com/package/pre-commit. Ну, и много прочих вариантов.


Если у вас есть мысли, комментарии, предложения или отклики по поводу этой страницы или этого цифрового сада в целом, напишите мне сообщение на agnessa@agnessa.pp.ru. Мне ооочень интересно!

Задонатить.


An IndieWeb Webring 🕸💍