4 ответов:
нет, положить их в репозиторий нормально, я бы даже предложил сделать это (если они полезны и для других). Пользователь должен явно разрешить их (как вы сказали, например, ссылка), которая, с одной стороны, немного боли, но защищает пользователей с другой стороны от выполнения произвольного кода без их согласия.
Я вообще согласен с Scytale, с парой дополнительных предложений, достаточно, чтобы это стоило отдельного ответа.
во-первых, вы должны написать сценарий, который создает соответствующие символические ссылки, особенно если эти крючки связаны с применением Политики или созданием полезных уведомлений. Люди будут гораздо чаще использовать крючки, если они могут просто ввести
bin/create-hook-symlinksчем если бы они должны были сделать это сами.во-вторых, непосредственно символические крючки не позволяют пользователям добавлять их собственные личные крючки. Например, мне больше нравится пример крючка предварительной фиксации, который гарантирует, что у меня нет ошибок пробела. Отличный способ обойти это-бросить скрипт обертки крючка в ваше РЕПО и символическую ссылку все из крючков к нему. Затем обертка может исследовать
(предполагая, что это сценарий bash; эквивалент какargv[0]в противном случае), чтобы выяснить, какой крюк он был вызван, а затем вызвать соответствующий крюк в вашем РЕПО, а также соответствующий пользователь Хук, который придется переименовывать, передавая все аргументы каждому. Быстрый пример из памяти:#!/bin/bash if [ -x .local ]; then .local "$@" || exit $? fi if [ -x tracked_hooks/$(basename ) ]; then tracked_hooks/$(basename ) "$@" || exit $? fiсценарий установки переместит все ранее существовавшие крючки в сторону (append
.localк их именам), а также символическая ссылка всех известных имен крючков на приведенный выше скрипт:#!/bin/bash HOOK_NAMES="applypatch-msg pre-applypatch post-applypatch pre-commit prepare-commit-msg commit-msg post-commit pre-rebase post-checkout post-merge pre-receive update post-receive post-update pre-auto-gc" # assuming the script is in a bin directory, one level into the repo HOOK_DIR=$(git rev-parse --show-toplevel)/.git/hooks for hook in $HOOK_NAMES; do # If the hook already exists, is executable, and is not a symlink if [ ! -h $HOOK_DIR/$hook -a -x $HOOK_DIR/$hook ]; then mv $HOOK_DIR/$hook $HOOK_DIR/$hook.local fi # create the symlink, overwriting the file if it exists # probably the only way this would happen is if you're using an old version of git # -- back when the sample hooks were not executable, instead of being named ____.sample ln -s -f ../../bin/hooks-wrapper $HOOK_DIR/$hook done
от http://git-scm.com/docs/git-init#_template_directory, Вы можете использовать один из этих механизмов для обновления .git / hooks dir каждого вновь созданного РЕПО git:
каталог шаблонов содержит файлы и каталоги, которые будут копируется в $GIT_DIR после его создания.
каталог шаблонов будет одним из следующих (по порядку):
аргументация Дана с ... шаблон вариант;
содержимое переменной окружения $GIT_TEMPLATE_DIR;
метод init.переменная конфигурации templateDir; или
каталог шаблонов по умолчанию:/usr/share/git-core / templates.
The https://www.npmjs.com/package/pre-commit пакет npm обрабатывает это элегантно, позволяя вам указать крючки предварительной фиксации в вашем пакете.формат JSON.
Comments