2009-06-16 73 views
5

我们使用svn:externals来指定库的特定版本,例如像如何禁止subversion提交svn:修改外部?

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

当您在您的工作副本的修改,这样的签出外部,有可能犯即使外部链接到一个特定的修订,而不是HEAD。

在提交之后运行svn update时,工作副本中的更改将消失,因为Subversion会将所有内容都还原回修订版本12345.所以,您自己从未真正看到过更改,但它们仍然位于HEAD中,这很糟糕。

仅当外部不指向HEAD修订版时才可以禁止提交吗?

+0

什么是“承诺,这些外部对象”呢?有人致力于https://asdf.asdf.local/xyzlib/trunk/?什么包含什么修改? – 2009-06-16 13:23:09

+0

我重新配置了一下这个问题 – martinus 2009-06-16 13:32:10

回答

3

对于这些类型的验证,我也会推荐一个预先提交的钩子,但不是写一个脚本,很容易变得不可能理解我推荐使用像SVNKit这样的库 - http://svnkit.com/(如果你知道Java) 。

我已经使用这个库自己编写了一些预先提交的钩子,它很容易处理。您编写了一个小的可运行Java程序,该程序由Subversion的预提交钩子调用。然后很容易提取例如属性或URL的一部分进行验证,如果它不适用于您的“规则”,则拒绝该提交。

看看的SVNLookClient和SVNChangeEntry类 - 他们有最常见的情况的方法(例如,提取有关提交进度的信息)

1

由于您使用的是https,我假设您使用的是mod_dav_svn。您可以为您的库存储库设置一个额外的URL,并且只授予它的只读访问权限。这样,即使是通常可以提交给库的开发人员,也无法通过svn:external进行提交。

2

你可以尝试这样的事情:使用pre-commit script来检查提交是否去标记。如果是这样,然后失败并提供消息。 Read some more about subversion hooks.您必须重新编写正则表达式,以便在它不是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

如果您不承诺将外部定义为trunk的修订版本,为什么不根据该修订版制作新的标签?然后,您可以将svn:external point指向标记,并使用其中一种已记录的访问控制方法来限制对标记目录的提交(或将标记置于不同的repo中并使该repo只读)。