Git пост-получить крючок не работает

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

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

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

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

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

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

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

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

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

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

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

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

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

5 ответов

Решение

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

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

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

$ chmod +x /path/to/post-receive

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

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

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

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

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

#!/bin/sh
export > file

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

#!/bin/sh
export

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

Другие вопросы по тегам