CentOS 7 SVN 升级到 1.8

CentOS 7 默认仓库自带的 SVN 版本偏老(通常是 1.7.x)。大部分场景下够用,但当你遇到下面这些情况时就会想升级:团队要用 1.8 才支持的语法特性、旧版本存在已知安全漏洞,或者你需要在多台机器之间保持一致的 SVN 行为。此时可以通过配置 Wandisco 提供的 yum 源,把 SVN 升级到 1.8。

升级前先确认当前版本:svn --version --quiet。1.8 相比 1.7 增加了 --parents 等命令选项、更好的合并跟踪等改进,但对老项目来说升级并不是必须的,先评估需求再动手。

先看两个版本的主要差异,判断是否真的需要升级:

特性 SVN 1.7 SVN 1.8
工作副本格式 单一 .svn 目录 兼容 1.7 格式,新增元数据特性
--parents 选项 不支持 支持
合并跟踪 基础 显著改进,svn merge --reintegrate 更可靠
代理 / 认证 较旧 更新,支持更多环境

如果团队只是用 SVN 存文档和简单代码,1.7 的功能完全够用;真正驱动升级的通常是:要使用 1.8 专有命令或行为、旧版本存在安全问题、或者统一多台机器上的版本。反过来,如果没有任何硬性需求,继续用系统自带的 1.7 反而更稳——Wandisco 源本身已多年未维护,为升级引入的风险未必小于旧版本的问题。

1. 删除旧版 SVN

yum remove subversion

先删除系统自带的旧版本 SVN(注意原文章中的 remover 为笔误,正确命令是 remove)。

2. 设置 SVN 1.8 安装源

vi /etc/yum.repos.d/wandisco-svn.repo

输入如下内容:

[WandiscoSVN]
name=Wandisco SVN Repo
baseurl=http://opensource.wandisco.com/centos/7/svn-1.8/RPMS/$basearch/
enabled=1
gpgcheck=0

3. 执行安装

yum clean all && yum install subversion -y

4. 验证安装

svn --version

输出应显示版本为 1.8:

svn, version 1.8.16 (r1740329)
   compiled Apr 26 2016, 13:16:01 on x86_64-unknown-linux-gnu

再用 svnadmin --version 确认服务端工具同样升级成功——客户端与服务端工具版本不一致,可能出现仓库格式不兼容。还可以顺手验证仓库能否正常访问:

svnadmin verify /var/svn/repos
svnlook youngest /var/svn/repos

svnlook youngest 输出的修订号与升级前一致,说明仓库数据完好无损。

升级前的仓库备份

仓库升级和普通软件升级不一样:svnadmin 版本与仓库格式不兼容时,老仓库可能无法直接打开。稳妥的做法是先完整导出:

svnadmin dump /var/svn/repos > repos_backup.dump

万一出问题,用旧版 svnadmin load 就能还原,不丢任何提交历史。

一次性脚本

把整个升级过程合并为一条命令:

yum remove subversion
sudo tee /etc/yum.repos.d/wandisco-svn.repo <<-'EOF'
[WandiscoSVN]
name=Wandisco SVN Repo
baseurl=http://opensource.wandisco.com/centos/7/svn-1.8/RPMS/$basearch/
enabled=1
gpgcheck=0
EOF
yum clean all && yum install subversion -y && svn --version

升级后的一轮完整检查

升级完建议按下面顺序做一轮自检,把问题留在今天而不是留给线上用户:

  1. svn --version 确认客户端版本为 1.8;
  2. svnadmin --version 确认服务端工具一致;
  3. svnlook youngest /var/svn/repos 对比升级前的最大修订号;
  4. svn checkout 拉一个工作副本,随便改个文件再提交,走一遍完整读写流程;
  5. 确认原来的认证配置(如 authzpasswd)仍然生效。

注意事项

  1. 升级前请先备份 SVN 仓库(svnadmin dump),避免升级过程出现兼容性问题导致数据损坏;
  2. Wandisco 的仓库已停止维护多年,仅建议在兼容旧环境的场景下使用;如果是从零搭建,建议使用系统自带版本或迁移到 Git;
  3. gpgcheck=0 关闭了 GPG 校验,如安全要求较高可在配置中提供官方 GPG 密钥并设为 gpgcheck=1
  4. 如果升级后 svnadmin 版本与仓库格式不兼容,需要先用旧版 svnadmin dump 导出再导入。

升级后的常见问题

现象 处理
svn: E155021 等格式报错 先用旧版 svnadmin dump 导出,再用新版 svnadmin load 重建
svnadmin 仍是旧版 确认 yum 源生效,yum clean all 后重装一次
客户端连不上 检查 svnserve 或 Apache 模块是否随升级被重启/重装
认证失效 确认 authzpasswd 等配置文件路径和权限没有被改动

这些问题大多能在升级后的完整自检里提前发现,所以别跳过验证环节。

迁移到 Git 的替代方案

如果团队维护的仓库还没有历史包袱,也可以考虑直接迁移到 Git:用 git svn clone 可以把 SVN 历史完整导入 Git 仓库,之后享受更成熟的分支与 PR 协作和更丰富的生态工具。

迁移本身并不复杂:先在本地执行 git svn clone https://svn.example.com/repos -s myrepo 克隆全部历史,核对提交记录完整后,再推送到 GitHub 或 GitLab 的私有仓库,并通知团队成员切换工作流。注意迁移前让所有人先把本地修改提交并同步,避免历史分叉。对长期维护的项目,这是更值得投入的方向;如果只是想临时解决一个兼容性问题,则没必要为此换系统。

SVN 是常见的版本控制系统之一,更多版本控制与团队协作内容可以参考开发工具分类下的SVN 本地全局忽略设置Git 工作流与网站开发。无论选择升级到 1.8 还是迁移到 Git,备份先行、逐步验证这两条原则都不会错。

参考:Subversion 官方文档 https://subversion.apache.org/docs/

原文链接:https://www.cnblogs.com/cqzhuomi/articles/17280906.html(博客园 CQZHUOMI,转载)