如何禁止subversion提交到svn:修订版外部?
我们使用svn:externals来修改库的特定版本,例如如何禁止subversion提交到svn:修订版外部?,svn,permissions,svn-externals,Svn,Permissions,Svn Externals,我们使用svn:externals来修改库的特定版本,例如 xyzlib -r12345 https://asdf.asdf.local/xyzlib/trunk/ 当您在工作副本中对这样一个签出的外部版本进行修改时,即使外部链接指向特定版本,而不是标题,也可以提交 提交后运行svn update时,更改将消失在工作副本中,因为subversion会将所有内容恢复到12345版本。所以你自己从来没有真正看到这些变化,但它们仍然在你的脑海中,这是很糟糕的 只有当外部文件没有指向头部修订时,才可以
xyzlib -r12345 https://asdf.asdf.local/xyzlib/trunk/
当您在工作副本中对这样一个签出的外部版本进行修改时,即使外部链接指向特定版本,而不是标题,也可以提交
提交后运行svn update
时,更改将消失在工作副本中,因为subversion会将所有内容恢复到12345版本。所以你自己从来没有真正看到这些变化,但它们仍然在你的脑海中,这是很糟糕的
只有当外部文件没有指向头部修订时,才可以禁止提交吗?因为您使用的是https,我假设您使用的是
mod\u dav\u svn
。您可以为您的库存储库设置一个附加url,并且只授予对它的只读访问权限。这样,即使是通常可以提交到库的开发人员也无法通过svn:external进行提交。您可以尝试这样的方法:使用a检查提交是否要提交到标记。如果是这样,请退出并提供消息。您必须重新编写正则表达式,以便它在非HEAD时失败,而不是在if是标记时失败
$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
如果您没有承诺将外部标记定义为主干的修订版,为什么不基于该修订版创建一个新标记呢。然后,您可以让您的svn:external指向标记,并使用其中一种有文档记录的访问控制方法来限制对标记目录的提交(或将标记放入不同的repo中,并使该repo为只读)。对于此类验证,我还建议使用预提交挂钩,但是我建议使用SVNKit之类的库(如果您了解Java的话),而不是编写一个很容易被证明是不可能理解的脚本 我自己使用这个库编写了几个预提交钩子,使用起来非常容易。您编写了一个小的可运行Java程序,该程序由Subversion从预提交钩子调用。然后很容易提取URL的属性或部分内容进行验证,如果提交不适用于您的“规则”,则拒绝提交
看看SVNLookClient和SVNChangeEntry类——它们有用于最常见情况的方法(例如,提取有关正在进行的提交的信息)。什么是“提交到这些外部”呢?有人承诺了吗?“什么内容包含什么修改?”我重新表述了这个问题。我真的不喜欢这个问题,因为当我切换到可写url的标题时,所有文件都必须删除并重新签出,因为你正在切换svn:外部到不同的修订版?我以前从未尝试过切换一个,但我不明白为什么它应该强制删除工作副本。我想问题是它不会切换,下次更新后仍然是r12345。而承诺的更改将进入HEAD(或因冲突而失败)。这不是dev的意图。