☰
银河麒麟V10安装SVN全攻略:从apt到离线部署与权限配置
2026/9/29 7:49:13 网站建设 项目流程

简介:本资源面向在银河麒麟操作系统上部署版本控制服务的运维与开发人员,提供一份完整的SVN环境搭建参考文档。内容围绕Subversion、Apache Portable Runtime(apr、apr-util)及SQLite等组件的源码编译安装展开,涵盖环境变量配置、版本库创建、svnserve.conf与passwd、authz三个核心文件的权限设置,以及服务启动与开机自启等环节,适合具备一定Linux基础、需要在内网或国产化环境中自建代码托管服务的读者。资源包为1个docx文档,约202KB,以图文步骤形式记录操作流程与关键命令,便于对照执行和排错。目前已有2788人学习下载,可作为银河麒麟平台下SVN部署的实操参考,帮助读者快速理清组件依赖关系与配置要点。

1. 银河麒麟装 SVN:为什么 apt install 经常不是终点

在银河麒麟 V10 上装 SVN,很多人第一反应是sudo apt install subversion,敲完发现要么提示找不到包,要么装上了却连不上服务端,要么提交时报权限错误。银河麒麟虽然基于 Linux,但它的软件源、安全机制和 ARM 架构适配跟常见的 Ubuntu、CentOS 有明显差异,直接套用网上的通用教程大概率会翻车。这篇内容面向的是在银河麒麟桌面版或服务器版上需要搭建 SVN 客户端或服务端的运维和开发人员,从软件源配置、安装、仓库创建、权限管理到客户端接入,把每一步的命令和参数都拆开讲清楚。如果你手上正好有一台银河麒麟 V10 SP1 或 SP2 的机器,跟着走一遍就能跑通。SVN 作为集中式版本管理工具,在政企内网和离线环境中仍然是主力,搞清楚它在银河麒麟上的安装逻辑,比记住几条命令更值钱。

2. 银河麒麟的软件源与 SVN 安装路径选择

2.1 先确认系统版本和架构再动手

银河麒麟的版本号直接决定软件源地址和包名,这一步不能跳过。打开终端,先跑三条命令确认基础信息:

# 查看系统版本和补丁级别 cat /etc/kylin-release # 查看内核版本 uname -r # 查看 CPU 架构(x86_64 还是 aarch64) uname -m

/etc/kylin-release里的内容会告诉你具体是 V10 SP1、SP2 还是 SP3,补丁级别不同,软件源里的包版本也不一样。uname -m的输出如果是aarch64,说明你用的是 ARM 架构的银河麒麟,这在国产化替代场景里非常常见,后面选安装包时必须找 ARM 版本。很多人忽略架构检查,直接拿 x86 的离线包往 ARM 机器上装,结果就是一堆依赖报错。

确认完版本后,检查当前软件源配置:

# 查看软件源列表 cat /etc/apt/sources.list # 查看源配置目录下的额外文件 ls /etc/apt/sources.list.d/

银河麒麟默认的软件源指向官方仓库,但内网环境通常需要替换成企业自建的镜像源。如果sources.list里的地址在你的网络环境里不可达,apt update会直接超时,后面所有安装步骤都无从谈起。

2.2 在线安装:apt 方式的完整流程与参数说明

网络能通到软件源的情况下,在线安装是最省事的路径。完整流程如下:

# 更新软件包索引,-y 表示自动确认 sudo apt update # 安装 subversion 主包 sudo apt install -y subversion # 验证安装结果,查看版本号 svn --version --quiet # 查看 svn 命令的完整版本信息 svn --version

apt update的作用是刷新本地包索引,如果这一步报错,先解决源地址问题。apt install -y subversion会自动处理依赖,银河麒麟的 SVN 包依赖libapr1、libaprutil1、libserf等库,正常情况下 apt 会一并装好。svn --version --quiet只输出版本号,适合脚本里做判断;svn --version会列出所有支持的协议模块和编译选项,重点看输出里有没有ra_serf和ra_svn,这两个分别对应 HTTP 和 SVN 原生协议。

如果apt install提示找不到 subversion 包,大概率是软件源里没有收录,或者源地址配置有误。这时候先跑apt search subversion看看能不能搜到,搜不到就说明当前源里确实没有这个包,需要换源或者走离线安装。

2.3 离线安装:内网环境的 deb 包处理方式

内网机器没法访问外网源时,离线安装是唯一选择。思路是在一台能联网的同版本银河麒麟上把 deb 包下载下来,再拷贝到目标机器安装。

# 在联网机器上下载 subversion 及其所有依赖到指定目录 apt-get download subversion # 下载依赖包,先用 apt-cache 查看依赖列表 apt-cache depends subversion # 批量下载依赖(示例,实际依赖以 apt-cache 输出为准) apt-get download libapr1 libaprutil1 libserf-1-1 libsvn1

下载完成后,把所有.deb文件拷贝到目标机器同一目录下,执行:

# 一次性安装目录下所有 deb 包 sudo dpkg -i *.deb # 如果提示依赖缺失,用以下命令修复 sudo apt install -f

dpkg -i不会自动解决依赖,所以顺序很重要。如果安装过程中报依赖错误,apt install -f会尝试从本地已下载的包中补齐依赖。注意,ARM 架构的银河麒麟必须下载arm64后缀的 deb 包,x86 的包在 ARM 上装不了。

提示:离线安装前先用dpkg -l | grep subversion确认系统里没有残留的旧版本,有的话先sudo apt remove subversion清理干净再装。

3. 服务端搭建:从创建仓库到配置访问权限

3.1 创建 SVN 仓库与 svnserve 启动方式

装好 SVN 后,如果这台机器要作为服务端,第一步是创建仓库。仓库的目录结构决定了后续的访问方式,建议统一放在/var/svn下:

# 创建仓库根目录 sudo mkdir -p /var/svn # 创建一个名为 myproject 的仓库 sudo svnadmin create /var/svn/myproject # 查看仓库目录结构 ls /var/svn/myproject/

svnadmin create会在指定路径下生成conf、db、hooks、locks四个目录。conf目录里放的是配置文件,db是版本数据存储,hooks用于配置提交前后的钩子脚本。创建完仓库后,默认配置只允许本地访问,需要修改conf下的三个文件才能对外开放。

启动 svnserve 服务:

# 以守护进程方式启动,指定仓库根目录 sudo svnserve -d -r /var/svn # 查看 svnserve 是否在监听 ss -tlnp | grep 3690

-d表示以 daemon 模式运行,-r指定仓库的根路径。启动后 svnserve 默认监听 3690 端口。如果ss命令看不到监听,检查防火墙是否放行了 3690:

# 查看防火墙状态 sudo firewall-cmd --state # 放行 3690 端口(firewalld) sudo firewall-cmd --permanent --add-port=3690/tcp sudo firewall-cmd --reload

银河麒麟桌面版可能用的是ufw而不是firewalld,用sudo ufw status确认。防火墙没放行是新手最常踩的坑,服务端明明启动了,客户端就是连不上,排查半天发现是端口被拦了。

3.2 svnserve.conf 与 passwd 文件的参数逐项说明

仓库的访问控制集中在conf/svnserve.conf里,用编辑器打开:

sudo vim /var/svn/myproject/conf/svnserve.conf

需要修改的关键行如下:

[general] # 匿名访问权限:none 表示不允许匿名访问 anon-access = none # 认证用户权限:write 表示登录后可读写 auth-access = write # 指定用户名密码文件 password-db = passwd # 指定权限控制文件 authz-db = authz # 认证域名称,客户端连接时会显示 realm = /var/svn/myproject

anon-access = none是最关键的设置,默认值是read,意味着任何人不需要密码就能拉取代码。在内网环境里这可能是可接受的,但如果涉及敏感项目,必须改成none。auth-access = write给认证用户读写权限,如果只想让部分用户只读,需要在authz文件里细化。realm的值建议跟仓库路径保持一致,否则客户端切换仓库时可能反复弹密码框。

接着配置用户密码:

sudo vim /var/svn/myproject/conf/passwd
[users] # 格式:用户名 = 密码 zhangsan = Passw0rd123 lisi = Lisi@2024

密码是明文存储的,所以passwd文件的权限要收紧:

sudo chmod 600 /var/svn/myproject/conf/passwd

3.3 authz 权限文件:按目录粒度控制读写

authz文件是 SVN 权限管理的核心,支持按用户组和目录路径分配权限。配置示例:

[groups] # 定义开发组和测试组 dev = zhangsan,lisi test = wangwu # 根目录权限:开发组可读写,测试组只读 [/] @dev = rw @test = r # trunk 目录只允许开发组读写 [/trunk] @dev = rw @test = # tags 目录所有人只读 [/tags] * = r

@dev = rw表示 dev 组有读写权限,@test = r表示 test 组只有读权限,@test =表示 test 组没有任何权限。* = r里的*代表所有用户,包括未登录的匿名用户。权限的继承规则是子目录默认继承父目录,但显式配置会覆盖继承值。

修改完配置文件后不需要重启 svnserve,SVN 会在每次请求时重新读取配置。但如果改了svnserve.conf里的password-db或authz-db路径,就需要重启服务:

# 杀掉现有 svnserve 进程 sudo pkill svnserve # 重新启动 sudo svnserve -d -r /var/svn

注意:authz文件里路径的写法必须跟仓库内的实际目录结构一致,[/trunk]对应的是仓库根下的 trunk 目录,不要写成[/myproject/trunk],否则权限规则不会生效。

4. 客户端接入:命令行与小乌龟的配置要点

4.1 命令行检出、提交与常见报错处理

服务端配好后,客户端用svn checkout拉取代码:

# 检出仓库到本地目录 svn checkout svn://192.168.1.100/myproject --username zhangsan # 首次检出会提示输入密码,输入后选择是否保存

svn://是 svnserve 的原生协议,默认走 3690 端口。如果服务端配的是 Apache + HTTP 方式,地址要写成http://或https://。检出完成后,进入工作副本目录做日常操作:

# 查看当前工作副本状态 svn status # 添加新文件到版本控制 svn add newfile.txt # 提交修改,-m 后跟提交说明 svn commit -m "添加新文件" # 更新到最新版本 svn update

svn status的输出里,?表示未纳入版本控制的文件,A表示已添加待提交,M表示已修改,C表示冲突。提交前先跑svn status确认改动范围,避免把不该提交的文件带上去。

常见报错及处理:

报错信息原因解决方式
svn: E170013: Unable to connect to a repository服务端未启动或端口不通检查 svnserve 进程和防火墙
svn: E170001: Authentication failed用户名密码错误或权限不足核对 passwd 和 authz 配置
svn: E155004: Working copy locked上次操作中断导致锁残留执行svn cleanup
svn: E200009: Could not add all targets文件已在版本控制中先svn status确认文件状态

4.2 小乌龟 SVN 在银河麒麟上的替代方案

TortoiseSVN(小乌龟)是 Windows 上的图形化 SVN 客户端,银河麒麟上没法直接用。替代方案有两个:一是用 RabbitVCS,它提供类似小乌龟的右键菜单集成;二是用 IDE 自带的 SVN 插件,比如 VS Code 装 SVN 扩展、IDEA 配 SVN 命令行路径。

RabbitVCS 的安装:

# 安装 RabbitVCS 核心包和文件管理器集成 sudo apt install -y rabbitvcs-core rabbitvcs-cli rabbitvcs-nautilus # 安装完成后重启文件管理器 nautilus -q

装好后在文件管理器里右键就能看到 SVN 菜单。如果用的是命令行,rabbitvcs-cli提供了rabbitvcs命令,但功能比原生svn命令弱,建议还是以命令行为主。

VS Code 里配置 SVN,在设置里搜索svn.path,填入svn命令的绝对路径:

{ "svn.path": "/usr/bin/svn", "svn.enableProposedApi": true }

配置好后,VS Code 的源代码管理面板会多出一个 SVN 图标,可以查看文件状态、提交、更新。IDEA 的配置路径在Settings → Version Control → Subversion,把Use command line client的路径指向/usr/bin/svn即可。

4.3 提交权限报错的排查思路

热词里有人问「svn 拉取代码没问题但提交代码提示某一层上级目录没权限」,这个问题的根因在authz文件的权限继承上。SVN 的权限检查是逐层向上的,如果某个中间目录没有写权限,即使目标文件所在目录有写权限,提交也会被拒绝。

排查步骤:

# 在服务端查看 authz 文件内容 cat /var/svn/myproject/conf/authz # 确认报错路径对应的权限配置 # 假设报错路径是 /trunk/src/main/java # 需要确保 /trunk、/trunk/src、/trunk/src/main 都有写权限

解决方式是在authz里给中间目录显式加上写权限,或者把权限规则改成递归生效的写法。另一个常见原因是anon-access设成了none但客户端没带用户名密码,拉取时用的是缓存凭证,提交时缓存过期了,重新输入密码即可。

5. 避坑与排查:银河麒麟装 SVN 最容易翻车的五个点

5.1 软件源不可达导致 apt install 直接失败

现象:执行sudo apt install subversion后卡住很久,最后报Could not resolve或Connection timed out。

原因:银河麒麟默认软件源指向官方地址,内网环境无法访问,或者 DNS 配置有问题。

解决:先ping一下源地址确认网络连通性,不通就换成企业内网镜像源。修改/etc/apt/sources.list后执行sudo apt update刷新索引。如果内网完全没有源,走离线 deb 包安装。

5.2 ARM 架构装了 x86 的包导致依赖报错

现象:dpkg -i安装 deb 包时提示package architecture (amd64) does not match system (arm64)。

原因:下载的 deb 包是 x86 架构的,而机器是 ARM 架构的银河麒麟。

解决:用uname -m确认架构,ARM 机器必须下载arm64后缀的包。在联网机器上用apt-get download时,确保那台机器也是 ARM 架构,否则下载下来的还是 x86 包。

5.3 svnserve 启动了但客户端连不上

现象:服务端ss -tlnp能看到 3690 端口在监听,客户端svn checkout报Unable to connect to a repository。

原因:防火墙拦截了 3690 端口,或者 svnserve 绑定的是 127.0.0.1 而不是 0.0.0.0。

解决:检查防火墙规则,放行 3690 端口。确认 svnserve 启动命令里没有指定--listen-host 127.0.0.1。用ss -tlnp | grep 3690看监听地址,如果是127.0.0.1:3690就说明只绑了本地回环,需要改成0.0.0.0或者不指定监听地址。

5.4 authz 权限配置不生效

现象:修改了authz文件,但客户端权限没有任何变化。

原因:svnserve.conf里authz-db的路径写错了,或者authz文件里的路径跟仓库实际结构不匹配。

解决:确认svnserve.conf里authz-db = authz是相对路径,相对于conf目录。检查authz里的路径写法,[/]代表仓库根,[/trunk]代表根下的 trunk 目录。改完后不需要重启 svnserve,但建议用svn ls命令验证权限是否生效。

5.5 工作副本锁定后无法操作

现象:执行svn update或svn commit时报Working copy locked,提示运行svn cleanup。

原因:上次操作中途中断,比如网络断开、进程被 kill,导致工作副本里残留了锁文件。

解决:在报错的工作副本根目录执行svn cleanup。如果 cleanup 也失败,检查是否有其他 SVN 进程在占用,用ps aux | grep svn查看并杀掉残留进程。极端情况下需要删除.svn目录下的lock文件,但这个操作有风险,删之前先备份。

6. 用钩子脚本把提交规范卡在服务端

SVN 的hooks目录里预置了一批钩子脚本模板,其中pre-commit是最实用的一个。它可以在提交真正写入版本库之前做检查,比如强制提交说明不能为空、限制文件类型、校验代码格式。在银河麒麟上配置钩子的方式和标准 Linux 一样,但要注意脚本的执行权限和解释器路径。

先看hooks目录里有什么:

ls /var/svn/myproject/hooks/

会看到pre-commit.tmpl、post-commit.tmpl等模板文件。以pre-commit为例,创建一个强制提交说明非空的钩子:

# 复制模板并去掉 .tmpl 后缀 sudo cp /var/svn/myproject/hooks/pre-commit.tmpl /var/svn/myproject/hooks/pre-commit # 赋予执行权限 sudo chmod +x /var/svn/myproject/hooks/pre-commit

编辑pre-commit文件,写入以下内容:

#!/bin/bash # SVN 钩子脚本:强制提交说明不能为空 REPOS="$1" TXN="$2" # 用 svnlook 获取本次提交的日志信息 LOGMSG=$(svnlook log -t "$TXN" "$REPOS" | grep -c "[a-zA-Z0-9]") if [ "$LOGMSG" -lt 1 ]; then echo "提交被拒绝:请填写有意义的提交说明。" >&2 exit 1 fi # 检查通过,允许提交 exit 0

$1是仓库路径,$2是本次提交的事务号,这两个参数由 SVN 自动传入。svnlook log -t "$TXN" "$REPOS"读取本次提交的日志内容,grep -c "[a-zA-Z0-9]"统计日志里是否包含字母或数字。如果日志为空或者只有空格,LOGMSG就是 0,脚本返回 1 并输出拒绝信息,提交被阻止。返回 0 表示检查通过,提交正常写入。

钩子脚本里最容易踩的坑是解释器路径。银河麒麟上bash的路径是/bin/bash,但有些脚本模板写的是#!/bin/sh,如果脚本里用了 bash 特有的语法,用 sh 执行会报错。建议统一改成#!/bin/bash。另一个坑是脚本权限,chmod +x必须执行,否则 SVN 不会调用钩子,而且不会有任何报错提示,提交照样成功,你会以为钩子生效了其实根本没有。

验证钩子是否生效,在客户端做一次空提交说明的测试:

# 修改一个文件后尝试提交,不写说明 svn commit -m ""

如果配置正确,会看到提交被拒绝:请填写有意义的提交说明。的提示,提交被阻止。如果提交成功了,说明钩子没生效,检查脚本权限和svnserve进程的用户是否有权限执行该脚本。

我自己的习惯是每配一个钩子,先用svnlook命令手动跑一遍逻辑,确认输出符合预期再挂上去。钩子脚本出问题不会影响 SVN 服务本身,但会静默失效,不主动验证根本发现不了。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询