Subversion - Arch Linux 中文维基

跳至內容

# Subversion

出自 Arch Linux 中文维基
翻譯狀態：

- 本文（或部分內容）譯自 Subversion，最近一次同步於 2023-02-28，若英文版本有所更改，則您可以幫助同步與翻譯更改的內容。
- 您可以在 ArchWiki 的對應頁面找到本文翻譯的原始修訂歷史。
- 本文可能與英文原文存在出入。

"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

- https://svnbook.red-bean.com/en/1.1/svn-book.html#svn-ch-9-sect-2.2-re-load
- https://subversion.apache.org/

分類：​

- 版本控制系統
- 網絡伺服器

Subversion
新增話題