Имея один официальный репозиторий в качестве удаленного и несколько локальных репозиториев, клонированных из него, можно ли создать сценарий предварительной фиксации для этого основного репозитория и применить его ко всем его клонам?
Git удаленный / общий хук предварительной фиксации
Ответы (6)
Я так не думаю, поскольку хуки не клонируются.
Может быть, если этот скрипт ловушки сам версируется, а затем ссылается на (символическую ссылку) на серверах клонов (при условии, что их ОС поддерживает эту функцию ссылки).
Или, может быть, если хуки являются частью шаблона git каталог, используемый для создания клонов (что обеспечит только их присутствие в репозитории клонов, но не гарантирует, что они действительно используются и выполняются).
Но я не думаю, что есть какой-то «центральный» способ принудить коммит.
Как Джефроми объясняет еще более четко в комментариях (выделено мной):
Я думаю, что наличие принудительных хуков, распространяемых вместе с репозиторием, действительно противоречит идее репозитория git.
Мой клон - это мой репозиторий. Я должен иметь возможность использовать на нем git, как мне нравится, в том числе выбирать, запускать ли хуки.
(И с точки зрения безопасности это было бы действительно страшно - никто не должен иметь возможность заставить меня для выполнения определенных сценариев всякий раз, когда я запускаю определенные команды git.)
Я согласен с этим комментарием и видел только способы обеспечить соблюдение правил, применяемых локально, в данном специализированном репо.
Например, вы не будете напрямую нажимать на центральное репо, а сначала перейдете в репо QA, которое будет принимайте вашу фиксацию только в том случае, если она соответствует определенным правилам. Если это так, то репо QA переместит вашу фиксацию в центральное репо.
Еще одна иллюстрация, непосредственно заимствованная из того, что я только что упомянул: «бессерверная непрерывная Интеграция с Git ", способ принудительно применить локально частную сборку, которая работает, прежде чем отправлять их куда-либо.
Вы не можете принудительно установить ловушку перед фиксацией в локальных репозиториях людей, но в центральном репо вы все равно можете запустить ловушку перед получением.
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
И да и нет.
Если вы пишете JavaScript, лучше всего это сделать с помощью Husky. У Husky есть скрипт postInstall, который будет настраивать ваши githooks и управлять ими. Затем вы можете настроить сценарии предварительной фиксации и предварительной настройки в своем package.json или файле с точками.
Вы можете использовать это для запуска произвольных скриптов. Я обычно yarn lint
и yarn test
препушую.
Если вы не используете JavaScript или не можете использовать Husky, вы можете клонировать обработчики фиксации на машины разработчика и зарегистрировать их в репозитории, но вы не можете заставить разработчиков запускать их.
Чтобы проверить свои хуки, создайте каталог hooks
где-нибудь в вашем репо. Затем поместите свои хуки туда, а не в обычный каталог .git/hooks
. Это та часть, которую вы можете применить.
Другая часть зависит от доброй воли разработчика. Чтобы установить папку хуков в качестве hooksPath, каждый разработчик должен запустить:
git config core.hooksPath hooks
Теперь все хуки в папке хуков будут работать, как и следовало ожидать.
Можно ли создать сценарий предварительной фиксации в этом основном репозитории и применить ко всем его клонам?
Из githooks(5)
:
pre-commit This hook is invoked by git commit, and can be bypassed with --no-verify option.
Поскольку ловушку можно легко обойти, похоже, ответ на ваш вопрос отрицательный.
Кроме того, поскольку каталог .git / hooks не клонируется, похоже, нет механизма для его отправки клиенту.
Предполагая, что у вас есть исходный код в вашем репозитории git, с которым связана система сборки, вы можете настроить систему сборки для настройки ловушки предварительной фиксации, то есть путем перемещения или связывания ловушки предварительной фиксации, для которой используется версия ~.
Я еще не пробовал. Я пришел сюда, пока искал лучшее решение.
Создаю новый файл: 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>"