SVN:如何在Subversion中设置只读分支?

作为我的雇主组织的首席Web开发人员,我负责为每个Web应用程序configuration和维护一个SVN仓库。 每个都有几个存档版本,至less有几个分支。

目前,为了部署每个网站的最新版本,我将合适的标签版本“导出”到Apache服务该站点的目录。 例如,假设我在/ var / www / dev / app中签出了一个工作副本:

$ cd /var/www/dev/app/archive/1.2 $ svn export . /var/www/html/www.myapp.com 

但是我实际上仍然希望将活动站点链接到存储库版本,这样我就可以执行“svn update”来获取最新的更新; 我只是不想在活动部署目录中将任何文件或小的修改提交回存储库。

我想要做的是在存储库中创build一个只读分支,它总是包含应用程序的最新生产版本,我可以检出到部署目录。

我已经看过很多开源项目,任何人都可以签出应用程序的特定分支,但是它是只读分支,所以你不能回过头去。

我怎样才能做到这一点?

如果您使用Apache来连接您的Subversion请求,则可以使用Subversion授权文件来控制对所有标签位置的访问。 从那里,你可以设置你的networking服务器拥有自己的帐户,授权为只读标签文件夹。 甚至可以让Web服务器甚至不读取除特定path上的标签目录以外的任何其他内容。

如果你总是创build一个与用于生产部署的名称相同的标签,那么svn更新将会起作用。 否则,你可以做一个svn开关来根据需要在标签之间切换。 根据Subversion的书 ,svn update和svn switch很好地做了同样的事情。

现在使用这个优点,你也可以提供更细粒度的控制你的开发人员可以做什么,不能做什么。 您还可以控制您的存储库的哪些部分用于公开阅读,哪些部分不是。

如果并且当你设置这个,如果你的网站是公开的,一定要告诉你的Web服务器不要提供.svn文件夹中的内容。

要closures所有提交,请添加一个预先提交的钩子脚本,如下所示:

 #!/bin/sh echo "Read-only SVN; no commits allowed!" 1>&2 exit 1 

或者,如果你想只读一个path(如一个分支或其他),请尝试:

 #!/bin/bash REPOS="$1" TXN="$2" if svnlook changed $REPOS -t $TXN |grep -q "mybranch/" ; then echo "Read-only branch mybranch/; no commits allowed! " 1>&2 exit 1 fi exit 0 

当然,你可以做任何你想要的其他检查, if声明。

添加一个预先提交的钩子脚本,检查潜在的提交更改的path,并拒绝提交到指定的分支的提交,除非它们来自任何授权的用户授权分支。

你也可以从服务器端回购权限这样做,你如何制定它们取决于你如何公开仓库。