基于Centos7.9搭建svn服务端
Svn-Server
- 开始搭建
- SVN 迁移
SVN 的全称为 Subversion,它是一个开源的版本控制系统。
- 基本原理
它采用集中式的版本管理方式,有一个中央版本库用于存放所有文件及版本信息,多个用户可以从这个中央版本库获取文件副本(称为工作副本)到本地进行操作,操作完成后再将更改提交回中央版本库。在这个过程中,SVN 能够记录文件的每一次修改、添加、删除等变更情况,方便回溯到不同的历史版本,查看文件是如何随着时间演变的。 - 主要功能
版本管理:能清晰地保存各个阶段文件的版本,用户可以轻松地查看某个文件过去的任意版本,便于对比不同版本之间的差异、恢复到之前的正确版本等,比如软件开发过程中对代码文件的版本管控。
协同工作:支持多人同时在一个项目上进行开发等工作,不同开发人员对各自负责的模块进行修改、完善后,依次将修改提交到中央版本库,能有效避免多人修改造成的混乱,协调团队成员间的协作。
权限控制:可以针对不同用户或用户组设置对文件、目录的不同访问权限,例如有的用户只有读取权限,而有的用户具备读写权限等,增强了项目的安全性和管理规范性。 - 应用场景
软件开发:是软件开发团队常用的工具之一,用于管理代码的版本迭代、开发分支等,方便团队成员共同开发一个大型软件项目,保证代码的有序性和可追溯性。
文档管理:对于企业内部文档,像项目文档、技术文档等,也可以通过 SVN 进行版本控制和管理,方便不同部门、人员在不同阶段对文档进行更新、查阅等操作
开始搭建
在CentOS 7.9 上搭建 SVN 服务端(使用 Apache httpd + mod_dav_svn)
- 安装必要软件包
httpd: Apache HTTP 服务器。
mod_dav_svn: 让 Apache 支持 SVN 的模块。
subversion: SVN 客户端和服务端核心工具。
yum install -y httpd mod_dav_svn subversion
创建 SVN 版本库
- 创建一个目录来存放所有的 SVN 仓库
mkdir -p /opt/svn
- 创建一个新的 SVN 仓库
svnadmin create /opt/svn/myproject
- 调整目录权限,让 httpd用户拥有读写权限:
chown -R apache:apache /opt/svn/myproject
chmod -R 770 /opt/svn/myproject
chcon -R -t httpd_sys_content_t /opt/svn/myproject
chcon -R -t httpd_sys_rw_content_t /opt/svn/myproject
配置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: 指定权限控制文件。
vi /etc/httpd/conf.d/subversion.conf
LoadModule dav_svn_module modules/mod_dav_svn.so
LoadModule authz_svn_module modules/mod_authz_svn.so# 为 SVN 仓库定义一个位置
<Location /svn># 启用 SVN DAVDAV svn# 指向所有仓库的父目录(使用 SVNParentPath)SVNParentPath /opt/svn# 或者指向单个仓库(使用 SVNPath)# SVNPath /opt/svn/myproject# 认证类型:BasicAuthType BasicAuthName "Authorization Realm"AuthUserFile /opt/svn/.htpasswd# 授权控制文件AuthzSVNAccessFile /opt/svn/authz# 只有认证用户才能访问Require valid-user
</Location>
创建用户和权限文件
- 创建第一个 SVN 用户
-c 参数表示创建文件,后续添加用户时不要加 -c,以免覆盖。
系统会提示输入并确认密码。
htpasswd -c -m /opt/svn/.htpasswd admin
- 如果需要修改用户密码
注意:不要使用 -c 参数,否则会创建新文件
修改立即生效,无需重启
htpasswd /opt/svn/.htpasswd admin
- 创建权限控制文件
[groups]: 定义用户组,方便管理。
[repository_name:/path]: 针对特定仓库的特定路径设置权限。
@groupname = permission: 给组赋权。
username = permission: 给个人赋权。
权限:r (读), w (写), 空 (无权限)。
vi /opt/svn/authz
[groups]
# 定义用户组
admin = admin,user1
dev = user2,user3# 为所有仓库设置默认权限(无权限)
[/]
* =# 设置 myproject 仓库的权限
[myproject:/]
@admin = rw
@dev = r
user4 = rw# 设置另一个仓库 'project2' 的权限
# [project2:/]
# @admin = rw
# @dev = rw
- 确保 httpd用户对这些文件有读权限
chown apache:apache /opt/svn/.htpasswd /opt/svn/authz
chmod 640 /opt/svn/.htpasswd /opt/svn/authz
- 启动并启用服务
systemctl start httpd
systemctl enable httpd
- 关闭防火墙和selinux
setenforce 0
systemctl stop firewalld
- 浏览器界面访问:http://ip/svn/myporject
输入设置的admin和用户后可查看
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: 生成的转储文件,可以任意命名。
svnadmin dump /opt/svn/old_repo > /tmp/old_repo.svndump
- 在目标服务器上准备并导入
创建新的空版本库
mkdir -p /opt/svn
svnadmin create /opt/svn/new_repo
- 加载转储文件到新库
svnadmin load /opt/svn/new_repo < /tmp/old_repo.svndump
- 调整权限
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
- 用户执行以下命令来切换工作副本指向新的服务器地址:
进入本地仓库目录,然后切换到新的服务地址
cd /path/to/your/working-copy
svn switch --relocate http://old-server/svn/old_repo http://new-server/svn/new_repo .
- 或者更简单直接的方法:重新检出一份,只是会重新下载仓库所有内容
svn checkout http://new-server/svn/new_repo new-copy
- 验证地址
svn info