你好,我是悟空~
本文主要内容如下:

前言
最近和一个研发团队打交道的比较多,了解到他们的代码管理用的是 SVN 工具,不是用的 Gitlab。
SVN(Subversion):集中式管理的版本控制系统,很多操作需要连上公共的 SVN 服务器才能操作,断网了则不能提交代码。简单易上手。SVN 创建分支其实需要先在远程服务器创建。。

SVN 集中式管理的示意图
Git:是分布式管理的版本控制系统,很多操作在本地就能完成,即使断网了也能提交代码到本地分支。功能强大较复杂。很多操作支持离线操作。

Git 分布式管理的示意图
他们使用 SVN 来管理代码仓库已经很久了,而且只有一个代码分支。为了优化他们的开发流程,悟空整理了一版基于 SVN 的多版本控制的开发流程,其中借鉴了 Git 的版本控制的思想。
有同学可能会疑问:为什么不切换到 Gitlab?
因考虑到目前部署和安全等多个因素,暂时不会切换到 Gitlab,需要一个过渡期。
接下来我们来看下用 SVN 如何做版本管理,如何优化开发、测试流程。
一、分支管理
SVN 服务的目录管理

branches 目录:存放非主干分支的目录,其中有一个 develop 目录作为开发分支,其他与 develop 的同级目录作为日常开发分支、Bug 修复分支、热修复分支。
因 SVN 的多个版本其实都是拷贝的原文件目录,所以版本不宜过多,代码包的整体大小不宜过大,控制在 100 M 以内。
trunk 目录:作为存放主干分支代码的目录
测试环境部署的是 develop 分支,当测试环境验证通过后,将 develop 分支 merge 到 trunk 分支上。
另外我们没有用到 Tags 这个概念,为了降低前期的流程复杂度。
分支命名
因 SVN 没有类似 Gitlab 的 issue 功能,所以分支的命名是不带 issue id 的,用的日期作为标识。
trunk:主干分支,不可重命名,不可删除。
develop: 开发分支,不可重命名,不可删除。
功能分支:feature_{日期}_{功能}。如:feature_20220809_login。
bug 修复分支:fix_{日期}_{功能}。如:fix_20220809_login。
热修复分支(hotfix):hotfix_{日期}_{修复功能}。如:hotfix_20220801_loginBug。
二、日常开发流程
开发流程和基于 Gitlab 的流程类似,但是 SVN 的功能没有 Gitlab 功能强大,所以有些细节不太一样。
整理了两种风格的开发流程,方便查看。

列表形式

流程图形式
三、热修复流程
当生产环境遇到紧急bug 时,可以考虑基于主干分支 trunk 分出一个 hotfix 分支,改完后,先提交到 hotfix 分支上,然后将 hotfix 分支merge 到 trunk 分支上,生产环境部署和验证通过后,再将 trunk 代码 merge 回 develop 分支,保持 develop 分支和 trunk 分支一致。

热修复流程
四、特殊流程
4.1 冲突解决
两个开发人员对同一个文件进行修改,彼此代码出现覆盖的情况就称为冲突。在较短的时间内,两个程序员对同一个文件同一处代码开发,后上传的会覆盖先上传的。
分两种冲突情况:
(1)对同一文件不同的代码处进行修改
后提交者,先更新自己的本地 develop 分支,然后merge到自己的开发分支,他人的代码和你的代码都会保留下来,然后再提交自己的分支代码,merge 分支到develop 分支。
(2)对同一文件的相同代码处进行修改
- 与冲突的那位同事商量,是用他的,还是用你的
- 如果用你的,先备份自己的代码,然后 revert 自己的改动,获取最新的代码,然后将自己的所有改动都覆盖上去。
- 如果用他的,先备份自己的代码,然后 revert 自己的改动,获取最新的代码。然后将其他的改动更新上去。(需要手动改,不要改动冲突处)
五、开发流程演示
SVN中常用的概念和操作如下:
- Repository(源代码库):源代码统一存放的地方。
- Checkout(提取):该操作用于从 Repository 中提取一份源代码到本地。
- Commit(提交):该操作用于将修改代码后的代码提交到 Repository。
- Update(更新):该操作用于同步本地源代码与 Repository 中的源代码。
SVN 客户端工具:TortoiseSVN
5.1 准备工作
准备工作阶段一般由项目的开发负责人来处理。
需要做的事情是在远程仓库创建 trunk 主干分支,上传项目初始代码到这个分支。
5.1.1 初始化 svn 项目
首先在 svn 服务器上创建一个仓库,
这里我用 docker 命令创建了一个仓库:ccm-repo
docker exec -it svn-server svnadmin create ccm-repo
然后需要添加用户名和密码。进入到 svn-server 容器中,修改 /var/opt/svn/ccm-repo/conf 目录下的passwd、authz、 svnserve.conf 文件。
我们可以通过 TortoiseSVN 登录到 SVN 服务器上查看仓库的目录情况:

5.1.2 clone 仓库到本地
使用 TortoiseSVN 工具执行 SVN Checkout 操作

选择一个本地目录存放这个仓库。仓库地址路径为 svn://192.168.56.11/ccm-repo,本地路径为:E:\ccm。

5.1.3 准备 trunk 目录和 branchs 目录
拉取下来的项目是一个空项目,我们需要在根目录创建主干目录和分支目录。

创建 trunk 目录和 branchs 目录。

trunk 目录就是主干的顶级目录,直接在里面放项目代码就可以了。主干的目录命名为 trunk 是规范命名,和 Gitlab 的 master 含义一样。
5.1.4 提交初始代码到主干
5.1.4.1 添加源代码
我们可以将项目的初始代码拷贝到 trunk 目录。比如我在 trunk 目录下创建了一个 src 文件夹,用来存放源代码,里面添加了一个 member.java 文件。


可以看到我们有三项改动,添加 trunk 目录、添加 src 目录、添加 member.java 文件。

添加成功后,会提示具体改动了哪些项。

5.1.4.2 提交改动到远程仓库
当然,这个添加都是本地磁盘操作,还没有上传到 SVN 服务器,我们可以通过 TortoiseSVN Commit 改动到服务器。



5.1.4.3 查看远程仓库的版本
提交到 SVN 服务器后,我们可以通过 TortoiseSVN 工具查看远程仓库的版本。

5.1.5 创建 develop 分支
首先我们需要将之前创建的 branchs 提交到远程仓库。

基于 trunk 主干分支创建 develop 分支,存放到 branchs 目录。


如果创建失败,可以尝试勾选 create intermediate folders。
之后就会在远程仓库创建 develop 分支,本地是没有 /branchs/develop 目录的。如下图所示的SVN远程仓库的目录。

如果本地想看到 develop 分支,执行 SVN update 操作就可以了。

5.2 开发新功能或修复 bug
基于 develop 分支创建一个新的本地开发分支 feat_20220922_Login



远程仓库就会创建一个 feat_20220922_Login 分支,SVN update 获取这个分支。

修改代码并提交代码到当前分支 feat_20220922_Login。


远程仓库也可以看到开发分支的改动。

5.3 Code Review
方式:自己的分支开发完成后,开发组长到组员座位上进行 Code Review。
Review 没问题后,进行下一步。
5.4 合并开发分支到 develop 分支
开发人员自己将开发分支合并到 develop 分支中。develop 分支会被用来部署测试环境。
首先选中 develop 分支,然后用 SVN Merge 执行合并。

可以选择远程仓库的 feat_20220922_Login 分支合并到 develop 分支。这个操作只会修改本地的 develop 分支,我们还需要执行 SVN Commit 操作才能将改动提交到远程仓库的 develop 分支。



将 develop 的改动提交到远程仓库。


远程仓库 develop 已经可以看到改动了。

5.5 部署 develop 分支到测试环境
这个由测试人员在测试环境拉取 develop 分支的最新代码,并部署测试环境。
5.6 合并 develop 分支到主干分支
测试环境验证通过后,将 develop 分支合并到 trunk 主干分支
5.7 收尾工作
在远程仓库上删除开发分支。
六、总结
本篇只是利用 SVN 来优化项目中的开发测试流程,以及如何对 SVN 进行相关的操作,没有涉及到 SVN 的底层原理,以及 SVN 其他的功能,感兴趣的同学可以到官网查看,也可以等我更新啊~
参考资料:
- END -