Git post-receive крюк не работает - PullRequest
       98

Git post-receive крюк не работает

8 голосов
/ 10 февраля 2011

Моя установка - сервер Windows XAMPP, с включенным cURL и установленными Git и Hudson. Хадсон опрашивает Git каждую минуту, чтобы найти изменения, и если он их находит, он создает сборку. Я использую эту сборку в качестве сервера тестирования. Это отлично работает.

Я бы хотел установить хук пост-получения в моем центральном удаленном репозитории, который запускает функцию принудительной сборки Hudson.

Я создал файл post-receive под названием "post-receive" в каталоге ловушек в моем центральном репозитории Git, который отправляется из локальных веток разработчиков. Каждый из них толкает к своей собственной ветви в центральном хранилище. Я хочу запускать пост-получение сразу после каждого нажатия, вместо того, чтобы проводить опрос Хадсона Git каждую минуту.

Когда я открываю оболочку для удаленного сервера и запускаю «post-receive» в папке hooks, она запускается. Он просто не вызывается, когда люди нажимают на него из локальных копий репозитория в центральный.

Может быть, я не объясняю это правильно, но это то, как я понимаю Git.

Код пост-получения состоит из двух строк:

#!/bin/sh
curl http://myserver.com:8080/hudson/job/myjobname/build?token=mytoken

Опять же, когда я открываю оболочку и запускаю ее, она работает, но когда кто-то нажимает на нее, ничего не происходит, пока не пройдет минута или меньше, Хадсон понимает, что Git был изменен, и затем он создает.

Я с удовольствием уточню, если это будет необходимо. Любая помощь с благодарностью.

РЕДАКТИРОВАТЬ: После игры с этим, я чувствую, что, возможно, пост-получение не выполняется, потому что ссылки не обновляются что-то? В документации git написано

Он выполняется в удаленном хранилище один раз после обновления всех ссылок.

Означает ли это, что если ничего не обновится, оно не будет выполнено? И если это так, я почти уверен, что все обновляется, так что это не должно применяться.

Вот мой процесс: Сделайте правки локально. Зафиксируйте изменения. Нажмите из моей головы в удаленную ветвь, которая называется mybranch (не ветка master, которая извлечена) Это тот момент, когда я хочу, чтобы мой хук выполнил.

Ответы [ 5 ]

11 голосов
/ 10 февраля 2011

Пожалуйста, проверьте, имеет ли ваш файл исполняемые права. В противном случае это не может быть выполнено. Что-то вроде rwxr-xr-x должно быть достаточно.

Вы можете добавить пропущенный бит с помощью

$ chmod +x /path/to/post-receive
5 голосов
/ 10 февраля 2011

Какой способ транспортировки вы используете для репо?

Хуки выполняются только при использовании «умных» транспортных протоколов, таких как ssh и реализация cgi в http. Для других «тупых» транспортных протоколов, таких как ftp, rsync и более старая реализация http, перехватчики никогда не будут выполняться. Я предполагаю, что протокол git будет выполнять ловушки, но использование этого протокола никогда не считалось хорошей идеей.

3 голосов
/ 17 февраля 2011

Все эти ответы полезны, но оказывается, что мне нужна директория bin в моей переменной PATH.У меня был только каталог "cmd".Добавлен c:\my_path_to_git\git\bin в PATH, и он отлично работает.Я нашел этот ответ методом проб и ошибок и, глядя на журнал ошибок apache.Спасибо всем за помощь!

1 голос
/ 13 октября 2016

Я думаю, что простой ответ заключается в том, что вам необходимо переместить содержимое серверной части перехвата пост-получения вместо клиентской

1 голос
/ 10 февраля 2011

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

Если вы хотите увидеть, в какой среде выполняется скрипт post-receive:

#!/bin/sh
export > file

или просто (он покажет переменные env. После нажатия в репо)

#!/bin/sh
export

Кроме того, я не уверен, как работает сценариев оболочки в Windows, поэтому #! / Bin / sh вместо #! / Bin / sh поможет

...