Как работает хаски?

https://github.com/typicode/husky имеет возможность автоматически запускать git-хуки. что они могут быть разделены между группами в самом репозитории.

Как это вообще может работать? Поскольку хуки должны храниться в .git/hooks, который не добавляется в репозиторий

Он оборачивает команду git и перехватывает команды, запуская хуки, когда они происходят?

Я хочу воспроизвести это поведение для проектов python и php без необходимости зависеть от npm или node.


person geckos    schedule 31.07.2019    source источник
comment
Вы смотрели исходный код? Я не эксперт по javascript, но мне кажется, что хаски устанавливает хуки, когда вы его устанавливаете.   -  person Roland Smith    schedule 31.07.2019
comment
Я пытался это сделать. На github.com/typicode/husky/blob/   -  person geckos    schedule 01.08.2019
comment
Похоже, хуки createHook скопированы по ссылке выше. Кажется, это происходит в npm install времени вместо git clone. Мне нужно что-то подобное в пакете pip или пакете композитора, если я хочу, чтобы это работало в проекте python или php.   -  person geckos    schedule 01.08.2019


Ответы (2)


Пока установлена ​​зависимость husky (через npm install, npm add husky, yarn install,...), git-хуки создаются/обновляются в каталоге .git/hooks. Если хук запускается с помощью команды git, запускается скрипт от husky, который выполнит команду на основе менеджера пакетов, который вы использовали для установки. Если вы используете npm, выполняется npx --no-install husky-run $hookName "$gitParams". Эта команда просматривает вашу конфигурацию и выполняет команду, определенную для хука.

Это как прокси для git-хуков. Прокси устанавливается один раз и каждый раз запускается обычным git-хуком. Если он выполняется, он просматривает конфигурацию и выполняет определенные там команды.

person Nico    schedule 14.05.2020
comment
Спасибо за Ваш ответ. Это что-то интересное, установка запускает произвольный код, что представляет собой потенциальную угрозу безопасности. Я спросил, потому что пытался воспроизвести это поведение с помощью чистого git, но это невозможно. В конце концов, я не могу найти способ скопировать хуки в .git/hooks при клонировании, поэтому я поместил их в файл readme и позволил пользователю установить его вручную. Спасибо еще раз - person geckos; 14.05.2020

Начиная с версии 5 husky использует git core.hooksPath git config core.hooksPath .husky, если быть точным. Это делается на шаге husky install.

Поскольку папка .husky, созданная husky install, содержит скрипт pre-commit, он будет запущен перед фиксацией. По умолчанию в нем будет npm test, но вы можете отредактировать его по своему желанию.

Вы можете сделать что-то подобное в любом проекте. Просто добавьте папку .githooks и файлы ловушек внутри нее (проверьте .git/hooks для образцов файлов). Но вам нужно запустить git config core.hooksPath .githooks при клонировании репозитория (или первой настройке хуков). Для этого у вас может быть скрипт инициализации.
npm имеет scripts.prepare, который может запускать команды на npm install, в данном случае husky install.

person succerror    schedule 24.03.2021