我是SVN的新手,并试图学习它。我已经设置了SVN服务器,我可以办理入住/退房手续
来自它的文件。 作为下一步,我试图对它进行访问控制,并尝试添加一些提交挂钩到
阻止一些不必要的签到。
这是我的svn存储库:
/svnrepos/repo1
/svnrepos/repo2
/svnrepos/test >>>>>>> My test repository for playing around with SVN
现在我尝试使用预提交执行以下操作:
1. Preventing some users to check-in to a directory or any of its sub-folders
2. Preventing some files (say .class files) to be checked in by all users
这是我的环境:
Perl: v5.14.2 (linux 32-bit )
SVN: 1.7.4 (r1295709)
OS: Linux svnserver 2.6.18-164.el5 #1 SMP Tue Aug 18 15:51:54 EDT 2009 i686 i686 i386 GNU/Linux
我使用命令“svnserve -d -r / svnrepos --log-file /var/log/svn.log”运行svn服务器
现在我正在尝试为repository / svnrepos / test提供访问限制。我在尝试着 编辑commit-access-control.cfg文件以提供访问限制。这是内容 这个配置文件:
[Make everything read-only for all users]
match = .*
access = read-only
[Make test project read-write for admin users ]
match = ^trunk/svnrepos/test/samplefile.txt
users = PR111319
access = read-write
以下匹配模式似乎不起作用:
match=^trunk/svnrepos/test/samplefile.txt
match=^/svnrepos/test/samplefile.txt
match=/svnrepos/test/samplefile.txt
match=/test/samplefile.txt
match=^/samplefile.txt
无论我给出什么样的匹配模式,我在提交文件samplefile.txt时都会收到以下错误:
org.apache.subversion.javahl.ClientException: A repository hook failed
svn: Commit failed (details follow):
svn: Commit blocked by pre-commit hook (exit code 1) with output:
/svnrepos/test/hooks/commit-access-control.pl: user `PR111319' does not have permission to commit to
these paths:
/
samplefile.txt
但是,如果我将匹配作为。*,那么我就能成功提交它。从这一点来看,我很清楚问题在于'匹配'
以下是预提交文件的内容:
68 REPOS="$1"
69 TXN="$2"
70
71 # Make sure that the log message contains some text.
72 SVNLOOK=/opt/CollabNet_Subversion/bin/svnlook
73 $SVNLOOK log -t "$TXN" "$REPOS" | \
74 grep "[a-zA-Z0-9]" > /dev/null || exit 1
75
76 # Check that the author of this commit has the rights to perform
77 # the commit on the files and directories being modified.
78 /opt/ActivePerl-5.14/bin/perl "$REPOS/hooks/commit-access-control.pl" "$REPOS" "$TXN" "$REPOS/hooks/commit-access-control.cfg" || exit 1
79
80 # All checks passed, so allow the commit.
81 exit 0
如果您需要更多信息,请与我们联系。
谢谢和问候, Parasuraman.R
答案 0 :(得分:1)
第一件事:
我只想说清楚。您的所有存储库都将位于同一个钩子下。因此,除非你的钩子允许,否则没有人可以承诺repos1
或repos2
。
尝试使用svnlook
命令,因为钩子脚本正在使用它。这将为您提供有关如何在预提交挂钩的配置文件中指定文件的更好线索:
$ svnlook changed -r $revision $repository_directory
$repository_directory
是执行svnadmin create
命令时包含存储库的目录。你需要给它相对路径或完整路径。 $revision
是您正在查看的Subversion修订版的修订版号。尝试一些不同的修订版以查看更改内容您可以通过此命令获取最新修订版本:
$ svnlook youngest $repository_directory
您会注意到文件名前面没有/
,并且指定了完整路径。
我想提出一些建议:
由于您是Subversion的新手,暂时忘记pre-commit
挂钩。尝试使用Subversion一段时间的sans钩子,并了解它是如何流动的。
您已在钩子中指定trunk
,但我在您的存储库中看不到truck
。我觉得你并不完全了解标准Subversion存储库结构的工作原理。
Subversion的默认用法是在存储库的根目录中有三个名为trunk
,tags
和branches
的目录(是的,这些是目录名) 。在您的情况下,您可能需要以下目录,因为您将单个存储库视为三个独立的存储库:
repos1/trunk
repos1/tags
repos1/branches
repos2/trunk
repos2/tags
repos2/branches
test/trunk
test/tags
test/branches
您创建了您的存储库,然后在您的任何开发人员可以在存储库中获得他们的粗略小爪子之前,您创建这九个目录。然后,存储库中的所有文件都将放在这九个目录中的一个目录下。
同样,没有必要这样做的原因。如果您从未对代码进行分支或标记,则实际上不必执行此操作。这些目录甚至不必命名为trunk
,branches
和tags
。对于所有Subversion关注,可以将它们命名为main
,branches
,labels
或moe
,larry
,curly
。
然而,其他人都使用trunk
,branches
和tags
,因为如果其他人都这样做,我就是那种跳出屋顶的人,我推荐你也遵循标准的命名惯例。
大多数开发都发生在存储库的trunk
目录下。如果需要创建分支,可以将trunk
下的文件复制到具有特定分支名称的branches
目录。例如,我需要为1.3版创建一个bug修复分支:
$ svn cp svn://localhost/repos1/trunk svn://localhost/repos1/branches/1.3-bug-fixes
要在发布版本时标记文件,只需在tags
目录下复制您工作的目录:
$ svn cp svn://localhost/repos1/trunk svn://localhost/repos1/tags/1.3
$ svn cp svn://localhost/repos1/branches/1.3-bug-fixes svn://localhost/repos1/tags/1.3.1
这就是Subversion标记和分支的方式。它与大多数版本控制系统不同,但它有很多优点(很简单,通过svn ls
命令很容易找到标签和分支的名称,它可以为您提供完整的历史记录分支和标签。)