Почему я не могу выполнить скрипт ловушки на стороне клиента при фиксации коммутируемого пути?

957
aschipfl

У меня есть SVN-репозиторий (версия 1.9.2), и я использую клиент TortoiseSVN (версия 1.9.2) на компьютере с Windows 7 (x64). Существуют скриптовые скрипты на стороне клиента (start-commit, pre-commit и post-commit), которые хранятся в репозитории и, конечно, доступны в локальной рабочей копии. Эти сценарии устанавливаются с помощью специальных свойств tsvn:startcommithook, tsvn:precommithookи tsvn:postcommithookкаждый из них указывает на соответствующий файл сценария с помощью %REPOROOT%переменной, чтобы избежать необходимости указывать абсолютный путь рабочей копии.

Когда я фиксирую изменения в репозитории, все скрипты хуков (командные файлы .bat) работают нормально.

Однако, когда я пытаюсь зафиксировать изменения в файлах по коммутируемому пути, появляется следующая ошибка: и после подтверждения сообщения фиксация невозможна, диалоговое окно фиксации не появляется.

Я полагаю, что эта ошибка не вызывается скриптами ловушек (потому что нет никаких изменений, когда я пишу exit 0или exit 1в скриптах как единственная команда), но TortoiseSVN при попытке их выполнить, который, по некоторым причинам, кажется, не в состоянии найти соответствующий скрипт больше.

Итак, как я могу использовать подключаемые скрипты, которые находятся в репозитории и, следовательно, в рабочей копии?


Замена переменной %REPOROOT%полными абсолютными путями вообще не меняет поведение.

Когда я заменяю переменную %REPOROOT%на %REPOROOT+%в tsvn:*commithookсвойствах, ничего не меняется для переключаемых путей (поэтому появляется вышеупомянутое сообщение об ошибке), но для стандартных путей не выполняется скрипт ловушки и в конце концов не появляется сообщение об ошибке.


Как примечание: чтобы проверить, выполняется ли попытка запуска сценария перехвата, я полагаюсь на появление диалогового окна TortoiseSVN для утверждения / отклонения:
Утвердить или отклонить скрипт подключения на стороне клиента

3
Вы когда-нибудь решали эту проблему? Имейте точно такую ​​же проблему прямо сейчас. Carson 5 лет назад 0
К сожалению, пока нет, @Carson. Похоже, это ошибка TortoiseSVN для меня. Возможно, кто-то еще знает. Кстати, спасибо за награду! aschipfl 5 лет назад 0
@PimpJuiceIT, коммутируемый путь - это путь в рабочем каталоге, который связан с другим каталогом репозитория (с помощью функции Switch [Tortoise] SVN), чем отражается в дереве репозитория; например, существует дерево репозитория `проект / ветки / суб / а`,` проект / ветки / суб / б`, `проект / ветки / суб / с`,` проект / ствол / суб` и последнее извлечено в рабочая копия `C: \ SVN \ project \ sub`; теперь вы можете переключить `C: \ SVN \ project \ sub` на` project / branch / a / sub`; Проверьте наличие изменений, в правом нижнем углу отображается число переключаемых элементов; те пути, о которых я говорю ... aschipfl 5 лет назад 0
@PimpJuiceIT, проблема не может быть вызвана пакетным скриптом ловушек, потому что он появляется, даже когда я просто помещаю в него одну команду `exit 0`. `% REPOROOT%` должен разрешить URL-адрес корня хранилища (не рабочей копии), согласно помощи TortoiseSVN; скрипты ловушек помещаются в `^ / hooks /`, поэтому путь к файлу `% REPOROOT% / hooks / script.bat` ... aschipfl 5 лет назад 0
Интересно, можно ли каким-то образом «повторить» этот «% REPOROOT%» в файл журнала или что-то еще, чтобы подтвердить, что именно он разрешает путь, а затем вы можете проверить этот путь, чтобы убедиться, что он точен. Я прочитаю документ TortoiseSVN более подробно позже, когда у меня будет больше времени, похоже, проблема в том, что он не находит файл, на который ссылается, поэтому все, что вы можете придумать или попытаться проверить такие переменные и т. Д., Будет Хорошая отправная точка, по крайней мере, я бы подумал. Pimp Juice IT 5 лет назад 1
Да, я согласен, @PimpJuiceIT, `% REPOROOT%` нужно проверить. Я понятия не имею, как, хотя, потому что скрипт не запускается, поэтому `echo` там бесполезен ... (Когда я фиксирую родительский каталог коммутируемого пути, все работает, как и ожидалось ...) aschipfl 5 лет назад 0

1 ответ на вопрос

1
aschipfl

Хорошо, хотя это (еще) не полностью отвечает на вопрос, я начинаю ответ здесь и заполню его любыми новыми данными ...


Работа-Around

Чтобы обойти эту проблему, просто зафиксируйте родительский каталог пути коммутатора, а не сам коммутируемый путь или его дочерний элемент.

Просто чтобы упомянуть это: это не меняет поведение, чтобы рекурсивно применять свойство скрипта ловушки.


Синтаксис для пути скрипта хука (свойства tsvn:*hook)

Прежде всего, при указании пути к скрипту-ловушке очень важно, чтобы, как только вы использовали один из заполнителей %REPOROOT%или %REPOROOT+%, вы использовали косую черту /в качестве разделителя пути. Я полагаю, что это связано с тем фактом, что эти переменные содержат внутренний URL-адрес корня хранилища в соответствии с документацией, но не путь к локальной рабочей копии (WC). Для фиксированных локальных путей допускается как прямая, так /и обратная косая черта \.
В случае, если путь содержит SPACEs, вы должны поставить его между кавычками; Вы можете использовать цитату в целом, так как она не наносит вреда.


Нормальный и коммутируемый путь, уровни каталогов

Допустим, у нас есть хранилище на D:\TEST\repoсодержащий /trunk, /branches, /tagsи /hooksна высшем уровне, сценарий script.batв /hooksс содержимым exit 0, файл с именем file.txtв /trunkфилиала /trunkв /branches/testи другой ветви /trunkна /branch; WC проверен в D:\TEST\wc, но у нас есть редкая проверка, так что только /trunkи /hooksесть (оба полностью рекурсивно).

Затем установите новое свойство tsvn:startcommithookв корне WC, например:
Hook Script Property Setup Dialog

Теперь попробуйте зафиксировать что-нибудь в любом месте WC (root /trunkи т. Д.); Появится диалоговое окно подтверждения / отклонения сценария перехвата, показывающее следующий путь сценария перехвата, который является правильным, поэтому скрипт фактически запускается при нажатии «Выполнить»:
Hook Script Execution Approval/Rejection Dialog

Теперь переключите локальный путь D:\TEST\wc\trunkк WC на /branches/test, затем попробуйте зафиксировать локальный файл WC.file.txt ; в этот раз в диалоговом окне подтверждения / отклонения отображается следующий неверный путь:
Hook Script Execution Approval/Rejection Dialog

При нажатии «Выполнить» скрипт не может быть выполнен, очевидно:
Hook Script Execution Failure

Но при переключении локального пути WC D:\TEST\wc\trunkна /branchсейчас и попытке зафиксировать локальный файл WCfile.txt, диалоговое окно подтверждения / отклонения снова показывает правильный путь, как описано выше, и сценарий может выполняться.

Таким образом, очевидно, что различная глубина на уровне иерархии каталогов нормального и коммутируемого путей, кажется, препятствует правильному расширению заполнителя %REPOROOT%.
Это поведение точно такое же, если скрипт хука был зафиксирован или нет.