SVN虽无内置“版本流”,但可通过规范化分支策略、目录结构与协作流程模拟清晰可控的多项目并行开发流。关键在于使各项目生命周期(开发→测试→发布→维护)可识别、可追溯、可隔离、可回滚。

SVN本身不内置“版本流”概念,但通过规范化的分支策略、目录结构和协作流程,可以模拟出清晰、可控的多项目并行开发版本流。关键不是追求术语新颖,而是让每个项目的生命周期(开发→测试→发布→维护)可识别、可追溯、可隔离、可回滚。
一、确定仓库组织模式:单仓多项目 vs 多仓独立
这不是技术限制,而是管理权衡:
-
单仓库多项目:适合强关联、共享基础组件、需跨项目原子提交的场景。结构示例:
/repos
├── /common-lib(共用库)
├── /project-a
│ ├── /trunk
│ ├── /branches
│ └── /tags
└── /project-b
├── /trunk
├── /branches
└── /tags
优点:跨项目移动/合并历史完整;备份、钩子、升级一次搞定;权限可精细到子路径。
风险:所有项目共用一个全局修订号;权限配置稍复杂;仓库体积增长快。 -
多仓库独立:适合业务解耦、团队自治、安全隔离要求高的场景。每个项目一个仓库:
/repos/project-a
/repos/project-b
/repos/common-lib
优点:完全隔离,互不影响;修订号只反映本项目变更;权限配置极简;便于迁移或拆分。
风险:跨项目复用需靠外部依赖(如Maven/NuGet);备份、钩子需逐个维护;无法原子性提交跨项目改动。
二、定义统一的分支模型与命名规范
避免“分支泛滥失管”,必须约定谁在何时建什么分支、存续多久、如何合并:
《SVN视频教程》,SVN:全称Subversion,是代码版本管理软件,管理着随时间改变的数据。这些数据放置在一个中央资料档案库 (repository) 中。这个档案库很像一个普通的文件服务器,不过它会记住每一次文件的变动。这样你就可以把档案恢复到旧的版本, 或是浏览文件的变动历史。许多人会把版本控制系統想像成某种“时光机器”。
- 主干(trunk)只接受已验证的交付:禁止直接在trunk上开发。它代表“当前可发布基线”,应始终处于可构建、可测试状态。
-
功能分支(feature/xxx):按需求/任务创建,生命周期短(建议≤2周),命名含业务标识,如
feature/login-sso、feature/report-v2。 -
发布分支(release/x.x):从trunk拉出,用于集成测试、热修、版本冻结。例如
release/2.1。上线后合并回trunk,并打tag。 - 热修分支(hotfix/xxx):仅从最新release或tag拉出,修复线上紧急问题,修复后必须同时合入trunk和对应release分支。
- 严禁裸分支:每个分支创建时,必须在log中注明目的、关联需求ID、预期合入时间。
三、建立版本号映射机制,打通业务与SVN修订
SVN自带的递增整数修订号(r12345)对业务无意义。需引入可读、可追踪的业务版本号:
- 采用语义化版本(如
1.2.0)或四位业务编号(如V2.0.3.5)作为对外交付标识。 - 每次创建
tags/时,使用业务版本号命名:tags/V2.0.3.5,并在commit log中明确记录该tag对应的SVN修订号(如r18922)及变更摘要。 - 维护一张轻量级映射表(可放在wiki或持续交付系统中):
V2.0.3.5 → r18922(来自 release/2.0 分支)
V2.0.4.1 → r19005(hotfix for V2.0.3.5)
回滚时,直接查表定位SVN修订号,执行svn update -r 18922即可。
四、落地关键管控点
再好的流程,没有执行保障等于空谈:
-
权限按路径控制:用
authz文件限制写权限。例如:
[project-a:/trunk]
@dev-team-a = rw
@qa-team = r
[project-a:/branches/release/*]
@release-manager = rw
* =(拒绝所有) - 合并前强制代码审查:通过钩子脚本(pre-commit或pre-revprop-change)检查合并日志是否包含JIRA ID、是否标注了目标分支类型(如“MERGE feature/user-profile → trunk”)。
-
每日同步主干:要求各功能分支开发者每天至少执行一次
svn merge ^/project-a/trunk,减少后期合并冲突熵值。 -
废弃分支定期清理:设定策略(如合并后7天自动归档),避免
/branches目录堆积失效分支。

















