Изменить по умолчанию git крючки

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


Разъяснение скопировано из комментария к теперь удаленному ответу:

Мой вопрос заключается в том, можно ли изменить поведение по умолчанию для ВСЕХ новых репозиториев, поэтому их не нужно настраивать одинаково каждый раз для каждого нового репозитория. Легкий ответ - написать оболочку для создания и настройки репозиториев (он генерирует скрипты hook и chmods), но похоже, что это поведение по умолчанию также должно быть настраиваемым без необходимости этого делать.

Ответ 1

На странице git-init (также работает с git-clone, если вы клонируете существующее репо вместо создания нового с нуля):

       --template=<template_directory>
           Provide the directory from which templates will be used. The
           default template directory is /usr/share/git-core/templates.

           When specified, <template_directory> is used as the source of the
           template files rather than the default. The template files include
           some directory structure, some suggested "exclude patterns", and
           copies of non-executing "hook" files. The suggested patterns and
           hook files are all modifiable and extensible.

Вы можете изменить каталог всей системы (который по умолчанию равен /usr/share/git-core/templates, но может находиться в другом месте на вашем компьютере), вы можете указать --template=<template_directory> в командной строке при создании или клонировании репо, или вы можете настроить каталог шаблонов по умолчанию в своем файле конфигурации:

[init]
     templatedir = /path/to/templates

Ответ 2

С git 2.9 у вас есть новая опция для централизации перехватов: core.hooksPath

См. commit 867ad08, зафиксировать de0824e, commit bf7d977, совершить 49fa52f (04 мая 2016 г.) Ævar Arnfjörð Bjarmason (avar).
(слияние Junio ​​C Hamano - gitster - в совершить 6675f50, 17 мая 2016 года)

Документация git config теперь включает в себя:

core.hooksPath

По умолчанию git будет искать ваши крючки в каталоге $GIT_DIR/hooks.
Установите это на другой путь, например. '/etc/git/hooks' и git попытается найти ваши крючки в этом каталоге, например. '/etc/git/hooks/pre-receive' вместо '$GIT_DIR/hooks/pre-receive'.

Путь может быть как абсолютным, так и относительным. Относительный путь берется относительно каталога, в котором выполняются крючки

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

Автор этого пути (Ævar Arnfjörð Bjarmason avar) добавляет в его фиксация:

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


Git 2.10 использует эту новую настройку в git rev-parse --git-path hooks/<hook>

См. commit 9445b49 (16 августа 2016 г.) Йоханнес Шинделин (dscho).
(объединено Junio ​​C Hamano - gitster - в commit d05d0e9, 19 августа 2016 г.)

rev-parse: уважать core.hooksPath в --git-path

Идея опции --git-path заключается не только в том, чтобы не префиксные пути с выводом --git-dir все время, но также и уважать переопределения для определенных общих путей внутри каталога .git (например, git rev-parse --git-path objects будет сообщать значение переменная среды GIT_OBJECT_DIRECTORY, если установлена).

При введении настройки core.hooksPath мы забыли отрегулировать git_path() соответственно. Этот патч исправляет это.

Ответ 3

Создайте каталог git-hooks/ внутри своего репо. Поместите общие крючки туда.

Пусть люди сами решат, хотят ли они символически ссылаться и быть уязвимыми для изменений, выполняемых как их, или копировать файлы. Работа с Symlinks, люди могут выбрать, чтобы открыть такой вектор атаки безопасности, если они захотят.

Ответ 4

С git 1.6.5.3 (и некоторыми более ранними версиями) вы получите образцы крючков, доставленных в каталог .git/hooks:

$ ls .git/hooks
applypatch-msg.sample     post-update.sample        prepare-commit-msg.sample
commit-msg.sample         pre-applypatch.sample     update.sample
post-commit.sample        pre-commit.sample
post-receive.sample       pre-rebase.sample
$ 

Все они исполняются в моей системе. Чтобы использовать один из крючков, скопируйте или переименуйте файл, удалив суффикс '.sample'. Измените его в соответствии с вашими требованиями.


Адресация вопроса в комментарии - чтобы изменить установленные крючки образца по умолчанию, вам нужно найти каталог, в котором установлен git. На моей машине это $HOME/git - поэтому двоичный файл находится в $HOME/git/bin/git. Затем каталог, содержащий примерные крючки, следующий:

$HOME/git/share/git-core/templates/hooks

Если вы редактируете эти шаблоны (будьте осторожны), то это то, что будет скопировано в новые репозитории git. Они все равно будут образцами, но они будут вашими образцами.

Я не экспериментировал с созданием файла без образца в каталоге; он может быть или не быть скопирован. Будьте осторожны при изменении настроек по умолчанию, однако - при следующем обновлении вам придется переделать изменения.

Ответ 5

Для десортологии MacPorts будет /opt/local/share/git-core/templates/

Чтобы делиться крючками или шаблонами с членами группы, я обычно создаю подкаталог в проект вроде $PROJECT_DIR/lib/git/hooks затем создайте задачу Rake или оболочку script для копирования cp $PROJECT_DIR/git/hooks/* $PROJECT_DIR/.git/hooks. Символические ссылки не работают.