Subversion

来自 Arch Linux 中文维基

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

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

用于Subversion安装的Apache服务器[编辑 | 编辑源代码]

目标[编辑 | 编辑源代码]

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

  • 支持 HTTPS,比 svnserve 使用的 md5 认证更加安全。
  • 细粒度的控制权。可以使用 Apache 的认证限制目录的访问权限。可以允许所有文件可读,但仅允许提交 trunk,同时对另一组用户赋予提交 tags 和 branches 的权限。
  • 一个自由的源码库查看器
  • Subversion 团队正在进行无缝 webdav 集成的工作。不久你就能用任何 webdav 接口更新源码库中的文件。

安装[编辑 | 编辑源代码]

安装 Apache HTTP Server。除了 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
LoadModule ssl_module modules/mod_ssl.so	
LoadModule socache_shmcb_module modules/mod_socache_shmcb.so

创建/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 -p ~/svn-import/{branches,tags,trunk}

将源码添加到目录[编辑 | 编辑源代码]

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

$ cp -R /my/existing/project/* ~/svn-import/trunk

导入项目[编辑 | 编辑源代码]

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

测试SVN检出[编辑 | 编辑源代码]

$ svn checkout https://yourdomain.net/svn/REPO_NAME/ /my/svn/working/copy

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

设置 Svnserve[编辑 | 编辑源代码]

安装软件包[编辑 | 编辑源代码]

安装 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="--root=/path/to/repos"

The --root=/path/to/repos option set the root of repository tree. If you have multiple repositories use --root=/path-to/reposparent. Then access independent repositories by passing in repository name in the URL: svn://host/repo1. make sure that the user has read/write access to the repository files)

Optionally add a --listen-port if you want a different port, or other options.

By default, the service runs as root. If you want to change that, add a drop-in:

/etc/systemd/system/svnserve.service.d/50-custom.conf
[Service]
User=svn

Now start the svnserve.service daemon.

svn+ssh[编辑 | 编辑源代码]

To use svn+ssh://, we have to have a wrapper written for svnserve.

check where the svnserve binary is located:

# which svnserve
/usr/local/bin/svnserve

Our wrapper is going to have to fall in PATH prior to this location...

Create a wrapper with the following content:

/usr/bin/svnserve
#!/bin/sh
# wrapper script for svnserve
umask 007
/usr/local/bin/svnserve -r /path/to "$@"

Then, make it executable.

-r /path/to is what makes use of the svn co svn+ssh://server.domain.com:/reponame instead of :/path/to/reponame.

Start svnserve with new wrapper script like so:

# /usr/bin/svnserve -d  ( start daemon mode )

we can also check the perms for remote users like this:

$ svn ls svn+ssh://server.domain.com:/reponame
++server.domain.com++
dev/
qa/
release/

Subversion backup and restore[编辑 | 编辑源代码]

To back up your subversion repositories, do this for each repository you have.

$ svnadmin dump /path/to/repo > /tmp/repo.dump

To restore the backup, create the corresponding repositories first:

$ svnadmin create /path/to/repo

Then load svn dump into new repo:

$ svnadmin load /path/to/repo < /tmp/repo.dump

Setting permissions:

$ chown -R svn:svnusers /path/to/repo
$ chmod -R g+w /path/to/repo/db/

These repositories should now be all setup.

Subversion clients[编辑 | 编辑源代码]

See also Wikipedia:Comparison of Subversion clients.

  • kdesvn — Subversion client for KDE.
https://invent.kde.org/sdk/kdesvn || kdesvn
  • RabbitVCS — Set of graphical tools written to provide simple and straightforward access to the version control systems you use.
http://rabbitvcs.org/ || rabbitvcsAUR
  • RapidSVN — GUI front-end for the Subversion revision system written in C++ using the wxWidgets framework.
http://rapidsvn.tigris.org/ || rapidsvnAUR

See also[编辑 | 编辑源代码]