Как запретить фиксацию Subversion в svn:external для ревизий?

StackOverflow https://stackoverflow.com/questions/1001371

  •  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 для тега и использовать один из документированных методов контроля доступа, чтобы ограничить фиксацию для вашего каталога тегов (или поместить тег в другое хранилище и сделать его только для чтения).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top