Как запретить подрывные коммиты в svn: external к ревизиям? - PullRequest
5 голосов
/ 16 июня 2009

Мы используем svn: externals для определенных версий библиотеки, например как

xyzlib -r12345 https://asdf.asdf.local/xyzlib/trunk/

Когда вы вносите изменения в вашу рабочую копию для такого извлеченного внешнего, возможно зафиксировать, даже если внешние ссылки на конкретную ревизию, а не на ГОЛОВУ.

Когда вы запускаете svn update после фиксации, изменения будут потеряны в рабочей копии, потому что Subversion возвращает все обратно к ревизии 12345. Таким образом, вы никогда не увидите изменения сами, но они все еще находятся в HEAD, что плохой.

Можно ли запретить коммиты, только когда внешний не указывает на ревизию HEAD?

Ответы [ 4 ]

3 голосов
/ 05 января 2010

Для такого рода проверок я бы также порекомендовал ловушку перед фиксацией, но вместо написания скрипта, который легко может оказаться невозможным для понимания, я рекомендую использовать такую ​​библиотеку, как SVNKit - http://svnkit.com/ (если ты знаешь Java).

Я сам написал несколько хуков перед фиксацией, используя эту библиотеку, и с ней довольно легко работать. Вы пишете небольшую исполняемую Java-программу, которая вызывается из ловушки pre-commit Subversion. Тогда легко извлечь, например, свойства или части URL, чтобы выполнить проверку и отклонить фиксацию, если она не применяется к вашим "правилам".

Посмотрите на классы SVNLookClient и SVNChangeEntry - у них есть методы для наиболее распространенных случаев (например, извлечение информации о выполняющемся коммите.)

2 голосов
/ 05 января 2010

Вы можете попробовать что-то вроде этого: используйте сценарий предварительной фиксации , чтобы проверить, собирается ли фиксация на тег. Если так, то провалиться и предоставить сообщение. Подробнее о хуках Subversion. Вам нужно будет переписать регулярное выражение, чтобы оно не сработало, если оно не HEAD, а не с ошибкой, если это тег.

$SVNLOOK changed -t “$TXN” “$REPOS” | egrep -v “^[AD][[:space:]]+(.*/)?tags/[^/]+/$” | egrep “^[^[:space:]]+[[:space:]]+tags/[^/]+/.+”
if [ $? -eq 0 ] ; then
echo >&2 “***************************************”
echo >&2 “* Modification of tags is not allowed *”
echo >&2 “***************************************”
exit 1
fi
1 голос
/ 05 января 2010

Если вы не хотите, чтобы внешний определялся как ревизия транка, почему бы просто не создать новый тег на основе этой ревизии. После этого вы можете указать свою метку svn: external для тега и использовать один из документированных методов контроля доступа, чтобы ограничить фиксацию для вашего каталога тегов (или поместить тег в другое хранилище и сделать это хранилище только для чтения).

1 голос
/ 16 июня 2009

Поскольку вы используете https, я предполагаю, что вы используете mod_dav_svn. Вы можете установить дополнительный URL-адрес для вашего хранилища библиотеки и предоставить ему доступ только для чтения. Таким образом, даже разработчики, которые обычно могут фиксировать в библиотеке, не смогут зафиксировать через svn: external.

...