Помещение git-крючков в репозиторий



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

588   4  

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

    Ничего не найдено.