基于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
相关推荐
gihigo19986 天前
在CentOS上配置SVN至Web目录的自动同步
前端·svn·centos
程序员瓜叔20 天前
基于SVN搭建企业内部知识库系统实践
svn·centos
高旭的旭24 天前
Gitlab 配置自定义 clone 地址
svn·ssh·gitlab·code
白帽小野25 天前
SVN和Git两种版本管理系统对比
git·svn·版本控制系统
闲人一小枚1 个月前
mac Monterey 安装svn(已解决)
macos·svn
Jsy0509061 个月前
dvcs-ripper ---CTFHub技能树: SVN泄露
svn·小白·网安·信息搜集
长沙红胖子Qt1 个月前
关于 svn无法查看下拉日志提示“要离线”和根目录看日志“no data” 的解决方法
svn·离线·nodata·日志查看失败
码事漫谈2 个月前
SVN 仓库迁移与清理指南:如何正确切换仓库并保持代码整洁
svn
天和地丰2 个月前
AAltium SVN Database Library 配置使用说明
数据库·嵌入式硬件·svn