Subversion (简体中文)

From ArchWiki
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
翻译状态:本文是 Subversion_Setup翻译。上次翻译日期:2013-03-04。如果英文版本有所更改,则您可以帮助同步翻译。

"Apache Subversion 是一套功能全面的版本控制系统,最初被设计为CVS的改进版本。其后Subversion的发展大大超出了取代CVS的原始目标,但它的基本模型、设计和接口仍然受到了这一目标的深刻影响。"

本文主要介绍架设svn服务器的方法。有两种流行的svn服务器,内建的svnserve以及更高级的选择——结合了svn插件的Apache

用于Subversion安装的Apache服务器

目标

这篇指南的目标是结合Apache安装Subversion。选用Apache是因为其提供了单机svnserve不具备的诸多特性。

  • 你将学会使用https协议,比svnserve使用的md5认证更加安全。
  • 你将得到细粒度的控制权。你可以使用Apache的认证限制目录的访问权限。这意味着你可以允许所有文件可读,但仅允许提交trunk,同时对另一组用户赋予提交tags和branches的权限。
  • 你将得到一个自由的源码库查看器。虽然不太给力,但它确实可用。
  • Subversion团队正在进行无缝webdav集成的工作。不久你就能用任何webdav接口更新源码库中的文件。

安装Apache

这一指南没有涵盖Apache web服务器的安装和初始配置。这一主题包含在here

安装Subversion

除了 apache 之外,还需要安装官方软件仓库中的subversion

配置 Subversion

创建一个目录

# mkdir -p /home/svn/repositories

编辑 httpd.conf

请确认下列模块加载指令在文件中列出。如果没有请添加它们(通常你只需要添加后两行),保持先后顺序:

/etc/httpd/conf/httpd.conf
LoadModule dav_module           modules/mod_dav.so
 LoadModule dav_fs_module        modules/mod_dav_fs.so
 LoadModule dav_svn_module       modules/mod_dav_svn.so
 LoadModule authz_svn_module     modules/mod_authz_svn.so

用不用SSL?

SSL允许用户使用Apache的AuthType Basic而不必担心有人嗅探密码。

生成证书:

# cd /etc/httpd/conf/
# openssl req -new -x509 -keyout server.key -out server.crt -days 365 -nodes

然后添加下面的配置到/etc/httpd/conf/extra/httpd-ssl.conf,以便在虚拟主机配置指令中包含它们。

<Location /svn>
   DAV svn
   SVNParentPath /home/svn/repositories
   AuthzSVNAccessFile /home/svn/.svn-policy-file
   AuthName "SVN Repositories"
   AuthType Basic
   AuthUserFile /home/svn/.svn-auth-file
   Satisfy Any
   Require valid-user
</Location>

为了确保SSL设置已加载,取消/etc/httpd/conf/httpd.conf中SSL配置行的注释:

 Include /etc/httpd/conf/extra/httpd-ssl.conf

创建/home/svn/.svn-policy-file

[/]
* = r

[REPO_NAME:/]
USER_NAME = rw

/部分中的*用来匹配匿名用户。对除只读以外的任何访问Apache AuthType Basic都会提示输入用户名和密码。REPO_NAME:/一节继承了之前的权限设置,于是匿名用户对其有只读权限。最后一项设置为用户USER_NAME授予来REPO_NAME源码库的读写权限。

创建/home/svn/.svn-auth-file

这个文件可以用htpasswd或htdigest创建。这里使用了htpasswd。同样,因为SSL,不用过多担心密码嗅探。htdigest甚至会对嗅探提供更好的安全特性。

# htpasswd -cs /home/svn/.svn-auth-file USER_NAME

以上创建了文件(-c)并使用SHA1保存密码(-s)用户USER_NAME被创建。要添加其他用户,可以去掉 -c 选项:

# htpasswd -s /home/svn/.svn-auth-file OTHER_USER_NAME

创建源码库

# svnadmin create /home/svn/repositories/REPO_NAME

设置权限

对Apache用户设置新源码库的权限:

# chown -R http.http /home/svn/repositories/REPO_NAME

创建项目

项目的目录结构

创建 branches tags trunk 目录结构:

$ cd /path/to/directoryofchoice
$ mkdir branches tags trunk

将源码添加到目录

将源代码文件放入创建的 trunk 目录:

$ cp -R /home/USER_NAME/project/REPO_NAME/code/* trunk

导入项目

$ svn import -m "Initial import" https://yourdomain.net/svn/REPO_NAME/

测试SVN检出

$ cd /path/to/directory_of_choice
$ cd ..
$ rm -rf /path/to/directory_of_choice
$ svn co https://yourdomain.net/svn/REPO_NAME/

如果以上所有配置都成功,你应该能得到一个受版本控制的新源码库的副本。

安装Svnserve

安装软件包

pacman -S subversion

创建源码库

创建你的源码库

mkdir /path/to/repos/
svnadmin create /path/to/repos/repo1

初始源码库是空的,如果想导入文件,使用以下命令:

svn import ~/code/project1 file:///path/to/repos/repo1 --message 'Initial repository layout'

设置访问策略

编辑文件/path/to/repos/repo1/conf/svnserve.conf,在[general]中取消以下行的注释或者添加之:

password-db = passwd

你也许想改变对匿名用户的默认设置

anon-access = read

对允许任何人提交的源码库,替换"read"为"write",或者将其改为"none"来禁止所有匿名访问。

编辑文件/path/to/repos/repo1/conf/passwd

[users]
harry = foopassword
sally = barpassword

以上定义了用户harry和sally,分别使用密码foopassword和barpassword,可以按需修改。

启动服务器守护进程

在启动服务器之前,编辑配置文件

/etc/conf.d/svnserve
SVNSERVE_ARGS="-r /path/to/repos --listen-port=4711"
 SVNSERVE_USER="user"

(--listen-port标记是可选的,情确认用户对源码库文件有读写权限)

启动服务器:

# systemctl start svnserve

在启动时自动运行:

# systemctl enable svnserve

Subversion备份

关于备份Subversion源码库的指南请参阅Subversion backup and restore

Subversion 客户端

wikipedia 维护了一个客户端列表: Wikipedia article