版本管理之SVN实践教程:进阶篇(1):gitflow模拟:master&dev

这里写图片描述

在svn流行的时候,分支模型往往聚焦于主干/分支/发布管理三个重要的点上,而在此基础上apache所推荐的trunk/branches/tags也能清楚地反映出这些点。bug的修复,以及在发布时问题的管理等这些问题也可以通过目前的这种方式来实现,但在其后的分支模型中都将这些问题进行细化,所以会有更好的适应性,
在git的使用相关的文章中整理过一些管理git flow以及github flow相关的文章。在接下来的这几篇文章将试图以svn的方式来践行这些新的分支模型比如git flow。

git flow

git flow源于Vincent Driessen在2010年提出的一个分支模型:
这里写图片描述

主要特点

两个长期分支

git flow中有两个长期的分支,一直不会被删除,这两个分支是develop和master。

分支 生命期 作用说明
master 长期 用于保持和生产环境一致或者半步先于生产环境,主要目的用于保证生产环境的实时可用状态
develop 长期 开发的集成分支,主要目的用于显示最新的开发状况

三种临时分支

相比于长期存在的分支,git flow的模型中还有三种临时性的分支

分支类型 说明 是否可为多条
Feature分支 特性分支 可为多条
Hotfix分支 bug对应分支 可为多条
Release分支 release实施分支 可为多条

事前准备

准备镜像

可以使用前面文章中Dockerfile生成的alpine的svn的lts版本的镜像,也可以直接使用使用easypack打好的镜像。

[root@liumiaocn svn]# docker pull liumiaocn/svn:1.10.0
1.10.0: Pulling from liumiaocn/svn
8e3ba11ec2a2: Already exists 
4de3c6aa9a6d: Pull complete 
f64b6f3c550b: Pull complete 
Digest: sha256:c55a104e8f1cc10545b9e51aac4a40271540d0b13ab78c5c0e6ca40c0203f4f7
Status: Downloaded newer image for liumiaocn/svn:1.10.0
[root@liumiaocn svn]# docker images |grep liumiaocn/svn
liumiaocn/svn              1.10.0              15e2c7c993e6        Less than a second ago   12.4 MB
[root@liumiaocn svn]#

启动svn服务

[root@liumiaocn ~]# mkdir -p /usr/local/svn/gitflow
[root@liumiaocn ~]# cd /usr/local/svn/gitflow
[root@liumiaocn gitflow]# docker run -p 3690:3690 -v `pwd`/data:/data/svn --name svn -d liumiaocn/svn:1.10.0
eec53668f0a7e447dafee7416fe23261bfcc5fef56738439ab4cacdd4cb70f66
[root@liumiaocn gitflow]#

确认服务

[root@liumiaocn gitflow]# docker ps 
CONTAINER ID        IMAGE                  COMMAND                  CREATED             STATUS              PORTS                    NAMES
eec53668f0a7        liumiaocn/svn:1.10.0   "/usr/bin/svnserve..."   32 seconds ago      Up 31 seconds       0.0.0.0:3690->3690/tcp   svn
[root@liumiaocn gitflow]# 

仓库准备

进入svn容器中,创建演示用仓库:gitflow-repo

[root@liumiaocn gitflow]# docker exec -it svn sh
/data/svn # svnadmin create gitflow-repo
/data/svn # ls
gitflow-repo
/data/svn #

设定

svn服务的配置设定文件

对仓库的svn服务的配置设定文件,都做如下设定

设定项 说明 缺省值 备考
anon-access 匿名用户访问权限 read 有read/write/none三种取值
auth-access 认证用户访问权限 write 有read/write/none三种取值
password-db 用户名与密码信息 passwd 多仓库可使用相对路径
authz-db 用户与组权限设定 authz 多仓库可使用相对路径
/data/svn/gitflow-repo/conf # vi svnserve.conf
/data/svn/gitflow-repo/conf # egrep 'anon-access|auth-access|password-db|authz-db' svnserve.conf |grep -v '#'
anon-access = none
auth-access = write
password-db = passwd
authz-db = authz
/data/svn/gitflow-repo/conf # 

用户信息:passwd

设定svn的用户信息passwd如下

[users]
devuser1  = devuser1pw
devuser2  = devuser2pw
testuser1 = testuser1pw

权限设定:authz

设定svn的权限信息authz如下

[groups]
group_dev = devuser1,devuser2

[gitflow-repo:/]
@group_dev = rw
testuser1  = r

重启svn镜像

[root@liumiaocn gitflow]# docker restart svn
svn
[root@liumiaocn gitflow]#

初始化分支模型结构

svn与git在使用上还是有明显的不同的,所以可以考虑根据其特点进行设定,这里直接创建与gitflow一致的名称进行管理,与标准的gitflow的实现上可能会有所不同。

仓库 目录 类型 说明
gitflow-repo master 长期分支 trunk,主线分支,这里名称与gitflow的名称保持一致。用于保持和生产环境一致或者半步先于生产环境,主要目的用于保证生产环境的实时可用状态
develop 长期分支 开发的集成分支,主要目的用于显示最新的开发状况
features 临时分支 Feature分支,用于特性开发,可为多条,对应svn的branches下的分支细化
hotfixes 临时分支 Hotfix分支,用于bug对应,可为多条,对应svn的branches下的分支细化
releases 临时分支 Release分支,用户应用发布,可为多条,对应svn的tags下的分支

初始化分支

[root@platform ~]# svn co svn://192.168.163.129:3690/gitflow-repo --username devuser1 --password devuser1pw --non-interactive
Checked out revision 0.
[root@platform ~]# cd gitflow-repo/
[root@platform gitflow-repo]# 
[root@platform gitflow-repo]# mkdir -p master features hotfixes releases
[root@platform gitflow-repo]# svn add master features hotfixes releases
A         master
A         features
A         hotfixes
A         releases
[root@platform gitflow-repo]#

注意分支的构成的特点,master和develop各是一条长期分支,其余为多条,因为svn的分支管理上有很强的目录的痕迹,所以由branches和tags分化出的临时分支直接在结构上进行目录化。而开发分支develop的模拟,此处也会像在使用git进行模拟那样,初始化是从master分支生成。

使用master

首先在master上添加一个文件C1,并将其checkin到仓库中。

[root@platform gitflow-repo]# ls
features  hotfixes  master  releases
[root@platform gitflow-repo]# cd master
[root@platform master]# touch C1
[root@platform master]# svn add C1
A         C1
[root@platform master]# svn commit -m "add C1"
Authentication realm: <svn://192.168.163.129:3690> 556e6019-9d32-46ba-ab9b-04981167bfde
Password for 'devuser1': 

-----------------------------------------------------------------------
ATTENTION!  Your password for authentication realm:

   <svn://192.168.163.129:3690> 556e6019-9d32-46ba-ab9b-04981167bfde

can only be stored to disk unencrypted!  You are advised to configure
your system so that Subversion can store passwords encrypted, if
possible.  See the documentation for details.

You can avoid future appearances of this warning by setting the value
of the 'store-plaintext-passwords' option to either 'yes' or 'no' in
'/root/.subversion/servers'.
-----------------------------------------------------------------------
Store password unencrypted (yes/no)? yes
Adding         C1
Transmitting file data .
Committed revision 2.
[root@platform master]#

初期化develop分支

使用当前已经创建了一个文件C1的master分支,创建开发分支的主分支develop

[root@platform master]# export SVN_EDITOR=vi
[root@platform master]# svn copy svn://192.168.163.129:3690/gitflow-repo/master svn://192.168.163.129:3690/gitflow-repo/develop 

Committed revision 3.
[root@platform master]#

进入到根目录进行update,可以看到branch分支已经出现,习惯git的开发者可能会觉得目录和分支很容易相互混淆,工具而已,习惯就好了。

[root@platform master]# cd ..
[root@platform gitflow-repo]# svn update
Updating '.':
A    develop
A    develop/C1
Updated to revision 3.
[root@platform gitflow-repo]# ls
develop  features  hotfixes  master  releases
[root@platform gitflow-repo]# 

使用develop

这样就可以使用develop分支进行开发了,我们可以看到目前的状态是在master刚刚更新的基础之上,已经有了一个C1的文件,然后在develop分支上新增一个C2文件。

[root@platform gitflow-repo]# cd develop/
[root@platform develop]# ls
C1
[root@platform develop]# touch C2; svn add C2; svn commit -m "add C2 in develop branch"
A         C2
Adding         C2
Transmitting file data .
Committed revision 4.
[root@platform develop]# 

日志确认

[root@platform develop]# svn log
------------------------------------------------------------------------
r3 | devuser1 | 2018-08-26 17:21:33 -0400 (Sun, 26 Aug 2018) | 2 lines

init develop branch

------------------------------------------------------------------------
r2 | devuser1 | 2018-08-26 17:18:55 -0400 (Sun, 26 Aug 2018) | 1 line

add C1
------------------------------------------------------------------------
r1 | devuser1 | 2018-08-26 17:13:36 -0400 (Sun, 26 Aug 2018) | 1 line

init gitflow structure
------------------------------------------------------------------------
[root@platform develop]# cd ../master
[root@platform master]# svn log
------------------------------------------------------------------------
r2 | devuser1 | 2018-08-26 17:18:55 -0400 (Sun, 26 Aug 2018) | 1 line

add C1
------------------------------------------------------------------------
r1 | devuser1 | 2018-08-26 17:13:36 -0400 (Sun, 26 Aug 2018) | 1 line

init gitflow structure
------------------------------------------------------------------------
[root@platform master]# 

这样master和develop就已经就绪,可以继续gitflow分支模型的其他场景的模拟了。需要注意的是,虽然这是很小的一个动作,将develop分支给拆出来,但是在整个gitflow的模型实践中非常重要,这也是gitflow分支模型的一个重要特点。

你可能感兴趣的:(#,版本管理)