在svn流行的时候,分支模型往往聚焦于主干/分支/发布管理三个重要的点上,而在此基础上apache所推荐的trunk/branches/tags也能清楚地反映出这些点。bug的修复,以及在发布时问题的管理等这些问题也可以通过目前的这种方式来实现,但在其后的分支模型中都将这些问题进行细化,所以会有更好的适应性,
在git的使用相关的文章中整理过一些管理git flow以及github flow相关的文章。在接下来的这几篇文章将试图以svn的方式来践行这些新的分支模型比如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]#
[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服务的配置设定文件,都做如下设定
设定项 | 说明 | 缺省值 | 备考 |
---|---|---|---|
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 #
设定svn的用户信息passwd如下
[users]
devuser1 = devuser1pw
devuser2 = devuser2pw
testuser1 = testuser1pw
设定svn的权限信息authz如下
[groups]
group_dev = devuser1,devuser2
[gitflow-repo:/]
@group_dev = rw
testuser1 = r
[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上添加一个文件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]#
使用当前已经创建了一个文件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分支进行开发了,我们可以看到目前的状态是在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分支模型的一个重要特点。