基于Centos7.9搭建svn服务端

Svn-Server

SVN 的全称为 Subversion,它是一个开源的版本控制系统。

  • 基本原理
    它采用集中式的版本管理方式,有一个中央版本库用于存放所有文件及版本信息,多个用户可以从这个中央版本库获取文件副本(称为工作副本)到本地进行操作,操作完成后再将更改提交回中央版本库。在这个过程中,SVN 能够记录文件的每一次修改、添加、删除等变更情况,方便回溯到不同的历史版本,查看文件是如何随着时间演变的。
  • 主要功能
    版本管理:能清晰地保存各个阶段文件的版本,用户可以轻松地查看某个文件过去的任意版本,便于对比不同版本之间的差异、恢复到之前的正确版本等,比如软件开发过程中对代码文件的版本管控。
    协同工作:支持多人同时在一个项目上进行开发等工作,不同开发人员对各自负责的模块进行修改、完善后,依次将修改提交到中央版本库,能有效避免多人修改造成的混乱,协调团队成员间的协作。
    权限控制:可以针对不同用户或用户组设置对文件、目录的不同访问权限,例如有的用户只有读取权限,而有的用户具备读写权限等,增强了项目的安全性和管理规范性。
  • 应用场景
    软件开发:是软件开发团队常用的工具之一,用于管理代码的版本迭代、开发分支等,方便团队成员共同开发一个大型软件项目,保证代码的有序性和可追溯性。
    文档管理:对于企业内部文档,像项目文档、技术文档等,也可以通过 SVN 进行版本控制和管理,方便不同部门、人员在不同阶段对文档进行更新、查阅等操作

开始搭建

svnserve.conf VS Apache HTTPD 配置

特性 svnserve (每个仓库的 svnserve.conf) Apache HTTPD (全局的 httpd.conf 或 subversion.conf)
配置范围 仓库级别,每个库独立 全局级别,统一管理所有仓库
管理难度 繁琐(仓库多时) 方便(集中管理)
功能 基础 强大(支持HTTPS、LDAP、AD集成等)
性能 轻量、高效 功能丰富,开销稍大
推荐度 适用于简单内部环境 推荐用于生产环境

在CentOS 7.9 上搭建 SVN 服务端(使用 Apache httpd + mod_dav_svn)

  • 安装必要软件包
    httpd: Apache HTTP 服务器。
    mod_dav_svn: 让 Apache 支持 SVN 的模块。
    subversion: SVN 客户端和服务端核心工具。
bash 复制代码
yum install -y httpd mod_dav_svn subversion

创建 SVN 版本库,svnserve默认路径是/var/svn,如果有修改需要调整

  • 创建一个目录来存放所有的 SVN 仓库
powershell 复制代码
mkdir -p /opt/svn
  • 创建一个新的 SVN 仓库
bash 复制代码
svnadmin create /opt/svn/myproject
  • 调整目录权限,让 httpd用户拥有读写权限:
bash 复制代码
chown -R apache:apache /opt/svn/myproject
chmod -R 770 /opt/svn/myproject
  • 修改仓库路径配置文件
bash 复制代码
vi /etc/sysconfig/svnserve
bash 复制代码
OPTIONS="--daemon --root /opt/svn"

配置HTTPD

  • 编辑 Subversion 的配置文件
    SVNParentPath /opt/svn: 表示 /opt/svn 下的每一个子目录都是一个独立的 SVN 仓库。访问时用 http://your-server-ip/svn/myproject。
    SVNPath /opt/svn/myproject: 表示只配置一个单一的仓库。访问时用 http://your-server-ip/svn。
    AuthUserFile /opt/svn/.htpasswd: 指定存放用户密码的文件。
    AuthzSVNAccessFile /opt/svn/authz: 指定权限控制文件。
bash 复制代码
vi /etc/httpd/conf.d/subversion.conf
bash 复制代码
LoadModule dav_svn_module     modules/mod_dav_svn.so
LoadModule authz_svn_module   modules/mod_authz_svn.so

# 为 SVN 仓库定义一个位置
<Location /svn>
    # 启用 SVN DAV
    DAV svn

    # 指向所有仓库的父目录(使用 SVNParentPath)
    SVNParentPath /opt/svn

    # 或者指向单个仓库(使用 SVNPath)
    # SVNPath /opt/svn/myproject

    # 认证类型:Basic
    AuthType Basic
    AuthName "Authorization Realm"
    AuthUserFile /opt/svn/.htpasswd

    # 授权控制文件
    AuthzSVNAccessFile /opt/svn/authz

    # 只有认证用户才能访问
    Require valid-user
</Location>

创建用户和权限文件

  • 创建第一个 SVN 用户
    -c 参数表示创建文件,后续添加用户时不要加 -c,以免覆盖。
    系统会提示输入并确认密码。
bash 复制代码
htpasswd -c -m /opt/svn/.htpasswd admin
  • 如果需要修改用户密码
    注意:不要使用 -c 参数,否则会创建新文件
    修改立即生效,无需重启
bash 复制代码
htpasswd /opt/svn/.htpasswd admin
  • 创建权限控制文件

    groups\]: 定义用户组,方便管理。 \[repository_name:/path\]: 针对特定仓库的特定路径设置权限。 @groupname = permission: 给组赋权。 username = permission: 给个人赋权。 权限:r (读), w (写), 空 (无权限)。

vi /opt/svn/authz

复制代码
```bash
[groups]
# 定义用户组
admin = admin,user1
dev = user2,user3

# 为所有仓库设置默认权限(无权限)
[/]
* =

# 设置 myproject 仓库的权限
[myproject:/]
@admin = rw
@dev = r
user4 = rw

# 设置另一个仓库 'project2' 的权限
# [project2:/]
# @admin = rw
# @dev = rw
  • 确保 httpd用户对这些文件有读权限
bash 复制代码
chown apache:apache /opt/svn/.htpasswd /opt/svn/authz
chmod 640 /opt/svn/.htpasswd /opt/svn/authz
  • 启动并启用服务
bash 复制代码
systemctl start httpd
systemctl enable httpd
  • 关闭防火墙和selinux
bash 复制代码
setenforce 0
systemctl stop firewalld
  • 客户端上传文件验证测试

SVN 迁移

什么数据会被迁移?

  • 被迁移的是版本库本身的内容和历史,包括:
    所有版本的代码和文件
    每一次提交的日志信息(svn commit -m "message")
    每一次提交的作者(username)
    目录结构、分支(branches)、标签(tags)
    所有的属性(properties)

什么数据不会被迁移?

  • 绝对不会被迁移的是认证系统的配置,包括:
    用户密码文件
    Apache 的 .htpasswd 文件
    svnserve 的 conf/passwd 文件
    权限控制文件
    authz 文件(Apache 或 svnserve 的)
    服务器配置
    Apache 的 httpd.conf 或 subversion.conf
    svnserve 的 conf/svnserve.conf
    钩子脚本(hooks/)

迁移前需要提前在目标服务器上配置用户和权限管理


使用 svnadmin dump 和 svnadmin load命令进行迁移

  • 在源服务器上导出转储文件
    使用 svnadmin dump 命令将版本库导出为一个文件
    /opt/svn/old_repo: 源版本库的路径。
    old_repo.svndump: 生成的转储文件,可以任意命名。
bash 复制代码
svnadmin dump /opt/svn/old_repo > /tmp/old_repo.svndump

注:如果是在win系统上迁移到Linux,注意要在cmd窗口执行,而不是powershell否则会报错(svnadmin: E140001: Malformed dumpfile header '?\255?\254S')

  • 在目标服务器上准备并导入
    创建新的空版本库
bash 复制代码
mkdir -p /opt/svn
svnadmin create /opt/svn/new_repo
  • 加载转储文件到新库
bash 复制代码
svnadmin load /opt/svn/new_repo < /tmp/old_repo.svndump
  • 调整权限
bash 复制代码
chown -R apache:apache /opt/svn/new_repo
chmod -R 770 /opt/svn/new_repo
chcon -R -t httpd_sys_content_t /opt/svn/new_repo
chcon -R -t httpd_sys_rw_content_t /opt/svn/new_repo
  • 用户执行以下命令来切换工作副本指向新的服务器地址:
    进入本地仓库目录,然后切换到新的服务地址
bash 复制代码
cd /path/to/your/working-copy
svn switch --relocate http://old-server/svn/old_repo http://new-server/svn/new_repo .
  • 或者更简单直接的方法:重新检出一份,只是会重新下载仓库所有内容
bash 复制代码
svn checkout http://new-server/svn/new_repo new-copy
  • 验证地址
bash 复制代码
svn info
相关推荐
高旭的旭3 天前
Gitlab 配置自定义 clone 地址
svn·ssh·gitlab·code
白帽小野5 天前
SVN和Git两种版本管理系统对比
git·svn·版本控制系统
闲人一小枚10 天前
mac Monterey 安装svn(已解决)
macos·svn
Jsy05090617 天前
dvcs-ripper ---CTFHub技能树: SVN泄露
svn·小白·网安·信息搜集
长沙红胖子Qt18 天前
关于 svn无法查看下拉日志提示“要离线”和根目录看日志“no data” 的解决方法
svn·离线·nodata·日志查看失败
码事漫谈1 个月前
SVN 仓库迁移与清理指南:如何正确切换仓库并保持代码整洁
svn
天和地丰1 个月前
AAltium SVN Database Library 配置使用说明
数据库·嵌入式硬件·svn
我是李武涯1 个月前
svn与git Merge重要区别讲解
git·svn
Ellie艾藜1 个月前
mac版SVN客户端
svn