Subversion

出自 ArchWiki

此文章或章节需要改进语言、wiki 语法或风格。请参考 Help:Style

原因: 一些第一人称视角,未使用任何 标准章节。(在 Talk:Subversion 中讨论)

Apache Subversion 是“一个功能齐全的版本控制系统,最初设计为比 CVS 更好。Subversion 后来扩展到超出其最初取代 CVS 的目标,但其基本模型、设计和界面仍然深受该目标的影响。”

本文介绍如何在您的机器上设置 svn 服务器。 有两种流行的 svn 服务器,内置的 svnserve 和更高级的选项,带有 svn 插件的 Apache HTTP 服务器

Apache Subversion 设置

目标

本操作指南的目标是使用 Apache 设置 Subversion。 为什么要为 Subversion 使用 Apache? 很简单,它提供了独立 svnserve 不具备的功能...

  • HTTPS 支持。 这比 svnserve 使用的 MD5 身份验证更安全。
  • 细粒度的访问控制。 您可以使用 Apache 身份验证按目录限制权限。 这意味着您可以授予对所有内容的读取权限,但仅对 trunk 分支的提交权限,同时让另一个组拥有对 tags 或 branches 分支的提交权限。
  • 免费的仓库查看器
  • Subversion 团队正在努力实现无缝 WebDAV 集成。 在某个时候,您应该能够使用任何 WebDAV 界面来更新仓库中的文件。

安装

按照其文章中的描述安装 Apache HTTP 服务器

除了 Apache,您只需要 安装 subversion 软件包。

Subversion 配置

为您的仓库创建一个目录

# mkdir -p /home/svn/repositories

编辑 /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 用于 SVN 访问有一些好处,例如,它允许您使用 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(或 /etc/httpd/conf/extra/httpd-vhosts.conf,如果您不使用 ssl)。 将以下内容包含在虚拟主机指令中

<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
   Require valid-user
</Location>

要确保 SSL 设置被加载,请取消注释 /etc/httpd/conf/httpd.conf 中的 SSL 配置行,使其看起来像这样

LoadModule ssl_module modules/mod_ssl.so
LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
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) 并使用 SHA-1 存储密码 (-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 目录结构。

$ 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

如果一切正常,您现在应该拥有一个可用的、已检出的新创建的 SVN 仓库副本。

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"

--root=/path/to/repos 选项设置仓库树的根目录。 如果您有多个仓库,请使用 --root=/path-to/reposparent。 然后通过在 URL 中传递仓库名称来访问独立的仓库: svn://host/repo1。 确保用户对仓库文件具有读/写访问权限)

如果您想要不同的端口或其他选项,可以选择添加 --listen-port

默认情况下,该服务以 root 用户身份运行。 如果您想更改它,请添加一个 drop-in

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

现在启动 svnserve.service 守护进程

svn+ssh

要使用 svn+ssh://,我们必须为 svnserve 编写一个包装器。

检查 svnserve 二进制文件的位置

# which svnserve
/usr/local/bin/svnserve

我们的包装器必须在 PATH 中优先于此位置...

创建 一个包含以下内容的包装器

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

然后,使其 可执行

-r /path/to 使 svn co svn+ssh://server.domain.com:/reponame 而不是 :/path/to/reponame

像这样使用新的包装器脚本启动 svnserve

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

我们也可以像这样检查远程用户的权限

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

Subversion 备份和恢复

要备份您的 subversion 仓库,请为您拥有的每个仓库执行此操作。

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

要恢复备份,请首先创建相应的仓库

$ svnadmin create /path/to/repo

然后将 svn dump 加载到新仓库中

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

设置权限

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

这些仓库现在应该都设置好了。

Subversion 客户端

另请参阅 Wikipedia:Subversion 客户端比较

  • kdesvn — 用于 KDE 的 Subversion 客户端。
https://apps.kde.org/kdesvn/ || kdesvn
  • RabbitVCS — 一组图形工具,旨在提供对您使用的版本控制系统的简单直接的访问。
http://rabbitvcs.org/ || rabbitvcsAUR

参见