Git добавление локальных хуков с удаленного репозитория

Насколько я помню git не отправляет локально определенные хуки в удаленный репозиторий.

Соответственно, чтобы поделиться хуками с другими разработчиками, им надо копировать эти хуки из какой-либо папки определенной в проекте самостоятельно. Соотвественно, если хук претерпевает изменения, то и копировать его надо заново.

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

Может кто-то сталкивался?


Ответы (1 шт):

Автор решения: aleksandr barakin

как таковое содержимое каталога с хранилищем (в случае не-bare-хранилища — это содержимое каталога .git в корне рабочего каталога) не передаётся командой push (передаются объекты, хранящиеся внутри файлов в каталоге objects).

чтобы включить файлы с hook-ами в контроль версий, можно скопировать их в рабочий каталог. не прямо в корень, конечно, чтоб на глазах не маячили, а в какой-нибудь подкаталог, например (внезапно!) hooks. а в .git/hooks создать относительные символические ссылки на эти файлы.


например, в пустом хранилище я создал подкаталог hooks, переместил файл .git/hooks/commit-msg.sample в него (под именем commit-msg) и создал символическую ссылку:

$ mkdir hooks
$ mv .git/hooks/commit-msg.sample hooks/commit-msg
$ ln -s ../../hooks/commit-msg .git/hooks/

получилась такая картина:

$ tree hooks/ .git/hooks/
hooks/
└── commit-msg
.git/hooks/
├── applypatch-msg.sample
├── commit-msg -> ../../hooks/commit-msg
├── fsmonitor-watchman.sample
├── post-update.sample
├── pre-applypatch.sample
├── pre-commit.sample
├── prepare-commit-msg.sample
├── pre-push.sample
├── pre-rebase.sample
├── pre-receive.sample
└── update.sample

осталось добавить файл hooks/commit-msg под контроль версий и отправить коммит в общее хранилище:

$ git add hooks/commit-msg
$ git commit -m 'add hook commit-msg'
$ git push

а те разработчики, кому потребуется задействовать этот hook, должны однократно создать аналогичную символическую ссылку в своих локальных копиях хранилища:

$ ln -s ../../hooks/commit-msg .git/hooks/
→ Ссылка