Применение git post-commit hook ко всем текущим и будущим репозиториям

275

Я написал Git post-commit hook, и он работает правильно. Однако я хочу добавить этот хук для применения ко всем текущим (и будущим) репозиториям git, над которыми я работаю. Я попытался добавить хук к моему, ~/.git/hooks/а не в каталог хуков в каталоге проекта, однако, это, похоже, не сработало.

Есть ли способ создать глобальные хиты Git, которые будут применяться ко всем репозиториям в моей системе (без необходимости копировать их в каждый каталог проекта)? Если нет, то какое будет лучшее решение в будущем - возможно, шаблон git-init?

Swanson
источник
3
Начиная с Git 2.9 этот лучший подход к этому изменился: ответ VonC - лучшая ставка. stackoverflow.com/a/37293198/2741954
Симон Брахан
Отвечает ли это на ваш вопрос? изменить стандартные git hooks
Оливер Севеке

Ответы:

192

Я хочу добавить этот хук для применения ко всем текущим (и будущим) репозиториям git, над которыми я работаю

В git 2.9+ (июнь 2016 г.) все, что вам нужно сделать, это:

git config --global core.hooksPath /path/to/my/centralized/hooks

См. « Изменение стандартных git-хуков »: это было сделано для управления централизованными хуками.

VonC
источник
если у меня есть существующее репо и я хочу, чтобы все другие разработчики, которые извлекали изменения, имели обновленный хук предварительной фиксации, например, как мне это сделать? спасибо
Richlewis
@Richlewis ты имеешь в виду stackoverflow.com/a/40550555/6309 не совсем ясно?
VonC
@Richlewis Вам необходимо настроить общую папку, доступную для всех разработчиков, чтобы они могли ссылаться на них в своей локальной конфигурации.
VonC
к сожалению, я до сих пор не совсем понял. в репо /.git/hooks/pre_commitя могу указать на это?
Richlewis
@Richlewis Я ответил тебе на твой оригинальный вопрос.
VonC
290

Начиная с git 1.7.1, вы можете установить init.templatedir в вашем gitconfig, чтобы указать git, где искать шаблоны.

Установите это так:

git config --global init.templatedir '~/.git_template'

После этого новые репозитории, которые вы создаете или клонируете, будут использовать этот каталог для шаблонов. Поместите крючки, в которых вы хотите ~/.git_template/hooks. Существующие репозитории можно переинициализировать с помощью соответствующих шаблонов, запустив их git initв том же каталоге .git.

Для версий git старше 1.7.1 запуск git init --template ~/.git_templateбудет работать, если вы похожи на меня и по-прежнему хотите управлять своим .git_templateкаталогом вместе с остальными файлами точек. Вы также можете использовать эту $GIT_TEMPLATE_DIRсреду, чтобы указать, git initгде находится каталог вашего шаблона.

sklnd
источник
51
Отличный ответ. Если кто-то еще задается вопросом, git initстирает ли его повторный запуск на существующем репо - нет , см .: stackoverflow.com/questions/5149694/…
kontur
Для меня это не работает с относительным путем к папке с шаблоном git для копирования файлов с использованием git init в существующих репозиториях. Вместо этого мне пришлось использовать полный путь.
user847988
1
На окнах без кавычек: `git config --global init.templatedir d: \ git \ .git_template \`
Владимир Вуканац
1
Совет: крючки шаблона скопированы. Если вы хотите иметь возможность обновлять глобальные хуки вместе, поместите хук в другое место и добавьте символическую ссылку в каталог шаблонов (в Linux). Убедитесь, что путь к ссылке является абсолютным.
Тим Аллклер
1
Запуск git initфактически не обновляет крючки для меня. Кажется, он не будет перезаписывать файлы, которые уже есть. stackoverflow.com/questions/10791486/ . Вместо этого вам нужно сначала удалить старые файлы ловушек.
Фил Р
69

Если вы хотите, чтобы они были везде в вашей системе (включая пользователей кроме вас), вы можете изменить содержимое установленного каталога шаблонов - те, которые находятся там $PREFIX/share/git-core/templates/hooks, где $PREFIX, вероятно, /usr/localили /usr.

Если вы хотите, чтобы это было для вас, то да, самая простая вещь - это --templateопция git-init. Вы можете легко сохранить личный каталог шаблонов, в котором есть символические ссылки, на установленную версию значений по умолчанию, которые вы хотите сохранить (отдельные хуки, информационный каталог ...), а затем свой собственный контент hooks/post-commitи все остальное, что вы хотите настроить.

Cascabel
источник
11
Спасибо, это сработало хорошо. И чтобы задним числом применить его к моим существующим проектам, я просто побежал git initснова, и это добавило мой новый хук.
Суонсон
Это хороший обходной путь, но для этого потребуется изменить все свои репозитории. Это выполнимо, но не существует ли какой-либо возможности с плагином или чем-то еще (именно так это делается на базаре)?
Мартин Юдинг
2
Для встроенного Git SourceTree на OS X они находятся в/Applications/SourceTree.app/Contents/Resources/git_local/share/git-core/templates/hooks
CupawnTae
1
Для Windows это находится в каталоге git install в mingw64\share\templates\hooks(или mingw32 для 32-битной
версии
1
@nerdherd это сейчас в mingw64\share\git-core\templates\hooks(gfw 2.25)
RJFalconer
7

Минимальный подход заключается в создании git_hooks/каталога в вашем хранилище для отслеживания хуков, которые вы пишете для этого проекта, доведения его до сведения будущих пользователей, упоминая об этом в a README, и полагаясь на них, чтобы они поступали правильно после клонирования. Некоторое время я размышлял над этим и выбрал постепенный подход. В будущем я мог бы рассмотреть возможность использования такого инструмента, как git-hooks .

Нил Бест
источник
1
Это так, так далеко от реального решения, которое мне пришлось понизить, извините.
Виктор Шредер,