Git удаленный / общий хук предварительной фиксации

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


person Samer Buna    schedule 13.09.2010    source источник
comment
Если вы хотите принудительное применение, используйте ловушку обновления в центральном репо. Если ловушка выполняет проверку для каждой фиксации, вы все равно можете предоставить ловушку перед фиксацией; разработчики, скорее всего, примут его добровольно, чтобы сразу узнать, когда они сделали что-то не так, вместо того, чтобы ждать, пока они попытаются подтолкнуть.   -  person Cascabel    schedule 13.09.2010
comment
Возможные дубликаты: (stackoverflow.com/questions/3462955) и (stackoverflow.com/questions/427207)   -  person blong    schedule 10.12.2012


Ответы (6)


Я так не думаю, поскольку хуки не клонируются.
Может быть, если этот скрипт ловушки сам версируется, а затем ссылается на (символическую ссылку) на серверах клонов (при условии, что их ОС поддерживает эту функцию ссылки).

Или, может быть, если хуки являются частью шаблона git каталог, используемый для создания клонов (что обеспечит только их присутствие в репозитории клонов, но не гарантирует, что они действительно используются и выполняются).

Но я не думаю, что есть какой-то «центральный» способ принудить коммит.


Как Джефроми объясняет еще более четко в комментариях (выделено мной):

Я думаю, что наличие принудительных хуков, распространяемых вместе с репозиторием, действительно противоречит идее репозитория git.
Мой клон - это мой репозиторий. Я должен иметь возможность использовать на нем git, как мне нравится, в том числе выбирать, запускать ли хуки.
(И с точки зрения безопасности это было бы действительно страшно - никто не должен иметь возможность заставить меня для выполнения определенных сценариев всякий раз, когда я запускаю определенные команды git.)

Я согласен с этим комментарием и видел только способы обеспечить соблюдение правил, применяемых локально, в данном специализированном репо.
Например, вы не будете напрямую нажимать на центральное репо, а сначала перейдете в репо QA, которое будет принимайте вашу фиксацию только в том случае, если она соответствует определенным правилам. Если это так, то репо QA переместит вашу фиксацию в центральное репо.

Еще одна иллюстрация, непосредственно заимствованная из того, что я только что упомянул: «бессерверная непрерывная Интеграция с Git ", способ принудительно применить локально частную сборку, которая работает, прежде чем отправлять их куда-либо.

person VonC    schedule 13.09.2010
comment
Я думаю, что это действительно противоречит идее репозитория git иметь принудительные хуки, распространяемые вместе с репо. Мой клон - это мой репозиторий. Я должен иметь возможность использовать на нем git, как мне нравится, в том числе выбирать, запускать ли хуки. (И с точки зрения безопасности это было бы действительно страшно - никто не должен иметь возможность заставлять меня выполнять определенные сценарии всякий раз, когда я запускаю определенные команды git.) - person Cascabel; 13.09.2010
comment
@ Джефроми: ты знаешь, что такое шрам? Когда я набрал комментарий, перед отправкой отредактированного ответа я начал набирать «добавить ...», и FireFox на моем компьютере действительно предложил мне: добавить комментарий Джефроми. Не в первый раз, очевидно;) - person VonC; 13.09.2010
comment
Примечание для себя: см. Также stackoverflow.com/questions/3209208/ - person VonC; 13.09.2010
comment
+1 за предложение символических ссылок. Просто убедитесь, что хотя бы один перехватчик обновляет символическую ссылку, и все, что нужно сделать пользователям, это запустить его ОДИН РАЗ. Это по-прежнему необязательно, но хуки имеют версии :-) На самом деле безопасно только для определенных типов сред. - person WhyNotHugo; 02.12.2010

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

F. ex Мне нужно было убедиться, что сообщения фиксации подчиняются определенным правилам (для интеграции с трассировкой и т. Д.), Поэтому я использовал следующий хук предварительного приема, который проверяет все сообщения фиксации, отправляемые в центральный репозиторий, и будет отклонять push, если это не так. хорошо сформированный.

#!/bin/sh
while read rev_old rev_new ref
do
    MALFORMED="$(git rev-list --oneline $rev_old..$rev_new | egrep -v '#[0-9]+' |  awk '{print $1}' )"
    if [ x"$MALFORMED" != x ]
    then
        echo Invallid commit message on $MALFORMED
        exit 1
    fi
done

для получения дополнительной информации см. f.ex https://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks

person Jens Timmerman    schedule 05.01.2012

И да и нет.

Если вы пишете JavaScript, лучше всего это сделать с помощью Husky. У Husky есть скрипт postInstall, который будет настраивать ваши githooks и управлять ими. Затем вы можете настроить сценарии предварительной фиксации и предварительной настройки в своем package.json или файле с точками.

Вы можете использовать это для запуска произвольных скриптов. Я обычно yarn lint и yarn test препушую.


Если вы не используете JavaScript или не можете использовать Husky, вы можете клонировать обработчики фиксации на машины разработчика и зарегистрировать их в репозитории, но вы не можете заставить разработчиков запускать их.

Чтобы проверить свои хуки, создайте каталог hooks где-нибудь в вашем репо. Затем поместите свои хуки туда, а не в обычный каталог .git/hooks. Это та часть, которую вы можете применить.

Другая часть зависит от доброй воли разработчика. Чтобы установить папку хуков в качестве hooksPath, каждый разработчик должен запустить:

git config core.hooksPath hooks

Теперь все хуки в папке хуков будут работать, как и следовало ожидать.

person superluminary    schedule 20.03.2018

Можно ли создать сценарий предварительной фиксации в этом основном репозитории и применить ко всем его клонам?

Из githooks(5):

    pre-commit
      This hook is invoked by git commit, and can be bypassed with
      --no-verify option.

Поскольку ловушку можно легко обойти, похоже, ответ на ваш вопрос отрицательный.

Кроме того, поскольку каталог .git / hooks не клонируется, похоже, нет механизма для его отправки клиенту.

person bstpierre    schedule 13.09.2010

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

Я еще не пробовал. Я пришел сюда, пока искал лучшее решение.

person Andrew Wagner    schedule 03.08.2012

Создаю новый файл: pre-commit-hook.sh

#!/usr/bin/env bash
CHANGES=$(git whatchanged ..origin)

if [ ! -z "${CHANGES}" ]; then
    echo "There are changes in remote repository. Please pull from remote branch first."
    exit 1;
fi

exit 0;

И вот как я передаю Git:

bash pre-commit-hook.sh && git commit -m "<Commit message>"
person Vishrant    schedule 29.01.2019