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

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

作为我所在组织的首席 Web 开发人员,我负责为每个 Web 应用程序配置和维护 SVN 存储库。每个应用程序都有多个存档版本和至少几个分支。

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

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

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

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

我已经看到很多开源项目都这样做了,任何人都可以查看应用程序的某个分支,但这是一个只读分支,因此您无法重新提交该分支。

我怎样才能做到这一点?

答案1

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

如果您始终创建与生产部署相同的名称的标签,则 svn update 将起作用。否则,您可以根据需要执行 svn switch 以在标签之间切换。根据颠覆之书,svn update 和 svn switch 在底层几乎做着同样的事情。

现在使用这个的好处是,您还可以更精细地控制开发人员可以做什么和不能做什么。您还可以控制存储库的哪些部分可供公众阅读,哪些部分不可供公众阅读。

如果您设置了此功能并且您的网站是公开的,请务必告诉您的网络服务器不要提供 .svn 文件夹中的内容。

答案2

要关闭所有提交,请添加如下所示的预提交挂钩脚本:

#!/bin/sh

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

或者,如果您只想将一条路径设为只读(例如一个分支或类似的东西),请尝试:

#!/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语句中进行任何其他您想要的检查。

答案3

添加一个预提交的挂钩脚本,该脚本检查潜在的提交改变路径并拒绝提交到指定分支的提交,除非它们来自有权创建相关分支的用户。

您还可以从服务器端 repo 权限执行此操作,如何实施这些权限取决于您如何公开存储库。

相关内容