Git remote/shared pre-commit hook


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

5 62

5 ответов:

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

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

но я не думаю, что есть любой "центральный" способ принудительного выполнения фиксации.


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

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

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

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

вы не можете иметь предварительно зафиксировать крюк принудительно в локальных репозиториях peoples, но в вашем Центральном РЕПО вы все еще можете запустить предварительный прием крючка.

F. ex мне нужно было убедиться, что сообщения фиксации подчиняются определенным правилам (для интеграции trac и т. д) поэтому я использовал следующий крючок pre-receive, который проверяет все сообщения фиксации, передаваемые в центральный репозиторий, и будет запрещать 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 }' )"
    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

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

С githooks(5):

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

поскольку крюк можно легко обойти, кажется, ответ на ваш вопрос "нет".

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

Да и нет.

вы можете клонировать крючки фиксации на машинах разработчиков и проверять их в РЕПО, но вы не можете заставить разработчиков запускать их.

чтобы проверить свои крючки, создайте где-то в вашем РЕПО. Тогда положите ваши крючки там вместо обычного

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

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