Прежде всего, все перехватчики выполняются на СЕРВЕРЕ, а не на различных клиентских машинах. Это C:\mypath\myworkingcopy
на сервере? В противном случае он не будет обновляться.
Во-вторых, это дурной тон делать что-нибудь в хуке, которое может занять слишком много времени. Если вашему хуку нужно нечто большее, чем svnlook
, скорее всего, вы делаете это неправильно. Например, сколько времени может потребоваться для обновления этой рабочей копии? 10 секунд? 30 секунд? минута? Это дополнительное время, которое разработчик должен сидеть и ждать завершения своего коммита Subversion.
Намного, намного лучше использовать что-то, что может реагировать на события фиксации и делать такие вещи, как обновления рабочих копий или развертывание на веб-серверах за пределами ловушки после фиксации. Я настоятельно рекомендую Jenkins для этой работы. У Дженкинса есть несколько приятных особенностей:
- Это рентабельно (бесплатно не победить)
- Он хорошо поддерживается (задайте вопрос в Stackoverflow и получите быстрый ответ).
- Это несложно настроить и использовать.
А теперь вернемся к вашему вопросу:
Сначала убедитесь, что крюк движется. Добавьте в конец пакетного скрипта одну строку:
exit 2
Это заставит Subversion думать, что ловушка после фиксации не удалась, и вы должны получить сообщение об ошибке при фиксации. В противном случае ваш скрипт после фиксации не работает. Убедитесь, что сценарий запускается учетной записью, на которой запущен сервер Subversion.
Если вы получили сообщение об ошибке, скрипт запущен. Однако команда svn может не возвращать ошибку, которую улавливает процесс после фиксации. Обычно я не рекомендую писать хуки на языке пакетного программирования Windows из-за его ограничений. Используйте Python, Perl или PowerShell. Они лучше при обнаружении условий ошибки, и вы можете выйти из своего скрипта при обнаружении.
Опять же, все работает отлично, но вы смотрите не на ту рабочую копию (ту, что на вашем компьютере, а не на сервере). Когда вы запускаете ловушки вне сервера Subversion для тестирования, запускайте их на сервере от имени пользователя Subversion, запускающего серверный процесс.
Попробуйте эти вещи и посмотрите, решит ли это вашу проблему.
Дополнительные комментарии
Я создал репозиторий с svnadmin create
и запустил его с помощью svnserve
. Я обновил svnserve.conf
, чтобы можно было оформить заказ и зафиксировать код.
Я вошел в каталог hooks
, переименовал pre-commit.tmpl
в pre-commit.bat
и установил его как:
set 1>&2
echo "Blocked my me!" 1>&2
exit 2
Когда я попытался зафиксировать свои изменения, я получил:
Transmitting file data .svn: E165001: Commit failed (details follow):
svn: E165001: Commit blocked by pre-commit hook (exit code 2) with output:
[...]
PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.RB;.RBW
PERL_JSON_BACKEND=JSON::XS
PERL_YAML_BACKEND=YAML
PROCESSOR_ARCHITECTURE=AMD64
PROCESSOR_IDENTIFIER=Intel64 Family 6 Model 42 Stepping 7, GenuineIntel
PROCESSOR_LEVEL=6
PROCESSOR_REVISION=2a07
[...]
"Blocked my me!"
Хук должен удалить среду (включая PATH), но я предполагаю, что это только в Unix, а не в Windows. Вы можете увидеть, что PATHEXT
определено.
Затем я переименовал pre-commit.bat
в pre-commit.tmpl
и создал post-commit.bat`, который выглядит так:
echo This post-commit hook shall fail! 1>&2
exit 2
Во время фиксации я получил следующее:
Transmitting file data .
Committed revision 3.
Warning: post-commit hook failed (exit code 2) with output:
This post-commit shall fail!
Похоже, все работает по плану. Я не использую VisualSVN и не работаю в качестве службы. Интересно, может быть проблема с вашей переменной среды PATHEXT
.
Может быть, посмотрите, как он установлен в вашей учетной записи, на которой запущен сервер Subversion, и посмотрите, есть ли там .BAT
.
Я не могу сразу думать ни о чем другом.
person
David W.
schedule
16.04.2013