Как запретить фиксацию Subversion в svn:external для ревизий?
-
05-07-2019 - |
Вопрос
Мы используем svn:externals для определенных версий библиотеки, например.нравиться
xyzlib -r12345 https://asdf.asdf.local/xyzlib/trunk/
Когда вы вносите изменения в свою рабочую копию в такую проверенную внешнюю версию, можно зафиксировать ее, даже если внешняя ссылка связана с конкретной ревизией, а не с HEAD.
Когда ты бежишь svn update
после фиксации изменения в рабочей копии исчезнут, поскольку Subversion возвращает все обратно к ревизии 12345.Таким образом, вы сами никогда не увидите изменений, но они все еще находятся в HEAD, что плохо.
Можно ли запретить коммиты только тогда, когда внешний не указывает на HEAD-ревизию?
Решение
Для такого рода проверок я бы также рекомендовал использовать перехватчик предварительной фиксации, но вместо написания сценария, который может оказаться невозможным для понимания, я рекомендую использовать такую библиотеку, как SVNKit — http://svnkit.com/ (если вы знаете Java).
Я сам написал несколько перехватчиков перед фиксацией, используя эту библиотеку, и с ней довольно легко работать.Вы пишете небольшую работоспособную программу на Java, которая вызывается из ловушки предварительной фиксации Subversion.Тогда его легко извлечь, например.свойства или части URL-адреса для проверки и отклонения фиксации, если она не применима к вашим «правилам».
Взгляните на классы SVNLookClient и SVNChangeEntry — у них есть методы для наиболее распространенных случаев (например,извлечение информации о выполняемой фиксации.)
Другие советы
Вы можете попробовать что-то вроде этого: используйте скрипт предварительной фиксации , чтобы проверить, идет ли фиксация к тегу. Если так, то провалиться и предоставить сообщение. Подробнее о хуках Subversion. напишите регулярное выражение так, чтобы оно терпело неудачу, если оно не HEAD, а не терпело неудачу, если это тег.
$SVNLOOK changed -t “$TXN” “$REPOS” | egrep -v “^[AD][[:space:]]+(.*/)?tags/[^/]+/<*>#8221; | egrep “^[^[:space:]]+[[:space:]]+tags/[^/]+/.+”
if [ $? -eq 0 ] ; then
echo >&2 “***************************************”
echo >&2 “* Modification of tags is not allowed *”
echo >&2 “***************************************”
exit 1
fi
Поскольку вы используете https, я предполагаю, что вы используете mod_dav_svn
. Вы можете установить дополнительный URL-адрес для вашего хранилища библиотеки и предоставить ему доступ только для чтения. Таким образом, даже разработчики, которые обычно могут фиксировать в библиотеке, не смогут зафиксировать через svn: external.
Если вы не хотите, чтобы внешний определялся как ревизия транка, почему бы просто не создать новый тег на основе этой ревизии. Затем вы можете указать свою метку svn: external для тега и использовать один из документированных методов контроля доступа, чтобы ограничить фиксацию для вашего каталога тегов (или поместить тег в другое хранилище и сделать его только для чтения).