<<编程基础-语言SQL.Git.Docker>>
SQL.PLSQL
http://docs.pythontab.com
https://springcloud.cc/
https://echo.labstack.com/
https://beego.me/
http://flask.pocoo.org/
https://www.programcreek.com/
概述: 主要存放新产品研发的架构部署,架构解决方案,持续集成,持续部署和自动化的一些资料等。
############################################################################
use log_dev database, change your table name and timestamp day value, and excute it
select log_cd,func_cd,log_dhms from log_operate_1709 where created_date >= to_timestamp('2017-09-11', 'yyyy-mm-dd')
and log_cd <> '日志类型' order BY created_date DESC;
select log_cd,func_cd,log_dhms,infurl,infnm from log_pdt_data_1709 where created_date >= to_timestamp('2017-09-11', 'yyyy-mm-dd')
and log_cd <> '日志类型' ORDER BY created_date DESC;
--testing log SQL statements
select log_cd,func_cd,log_dhms,from_ip from log_operate_1709 where
created_date >= to_timestamp('2017-09-14', 'yyyy-mm-dd')
and log_cd <> '日志类型' order BY created_date DESC;
select log_cd,func_cd,log_dhms,infurl,infnm,from_ip from log_pdt_data_1709 where
created_date >= to_timestamp('2017-09-14', 'yyyy-mm-dd')
and log_cd <> '日志类型' ORDER BY created_date DESC;
--count log_operate_1709 and log_pdt_data_1709 tables current date record
select count(log_cd) from log_operate_1709 where log_cd <> '日志类型' and
created_date >= to_timestamp('2017-09-14', 'yyyy-mm-dd');
select count(log_cd) from log_pdt_data_1709 where log_cd <> '日志类型' and
created_date >= to_timestamp('2017-09-14', 'yyyy-mm-dd');
#################################################################################################################
白盒测试 需求用例 名词解释 houseblock锁房 RT+ 只改房含 RT* 不管改不改房含 只要改了房价 noshow 预定未到 结账folio 就是结账账单-已结账下面 下个+下面的
001.房价=====================================================
每日房价记录数与住店时间一致
houseblock记录数与住店时间一致
每日收取的房含要出现在每日房含表中的每一天,首日房含只能出现在首日
一期所有每日房价的价格代码、折扣一样
RT+只能有一套房含
RT只能有一套房含,且每日价格设定一样
002.预订=====================================================
没有来期大于等于今日的noshow账户
没有离期小于今日的在店账户
没有来期小于今日的预订账户
没有来期大于今日的在店账户
每个账户至少有一个住店客人,且账户表里的住店客人ID对应的存在
每个账户只能有一个预订人,且账户表里的预订人ID对应的存在
003.账务====================================================
客账交易金额与账务明细金额一致,12个细项金额也一致
账单的余额为0
已结账户余额为0
结账folio里的几个金额与明细一致
转账folio里的几个金额与明细一致
004.客房====================================================
空房态没有在店账户
占用房态必有在店账户
维修房态有对应的维修记录
houseblock
###################################################################
白盒测试 by 20170622
房价 housingprice_test001 housingprice_test002 housingprice_test003
1.每日房价记录数与住店时间一致
SELECT country, SUM( CASE WHEN sex = '1' THEN population ELSE 0 END), --男性人口 SUM( CASE WHEN sex = '2' THEN population ELSE 0 END) --女性人口 FROM Table_A GROUP BY country
2.houseblock记录数与住店时间一致
select * from emp where empno=7369 for update;
3.每日收取的房含要出现在每日房含表中的每一天,首日房含只能出现在首日
select * from emp where empno=7369 for update;
4.一期所有每日房价的价格代码、折扣一样
select * from emp where empno=7369 for update;
5.RT+只能有一套房含
select * from emp where empno=7369 for update;
6.RT只能有一套房含,且每日价格设定一样
select * from emp where empno=7369 for update;
7.每日房含12个分项的合计与每日房价的一致
select * from emp where empno=7369 for update;
预订 reserve_test001 reserve_test002
1.没有来期大于等于今日的noshow账户
SELECT arr_dt,dpt_dt,acct_no,resv_no FROM rsv_account WHERE acct_stus='NSW' AND arr_dt>今日
2.没有离期小于今日的在店账户
SELECT arr_dt,dpt_dt,acct_no,resv_no FROM rsv_account WHERE acct_stus='STY' AND dpt_dt<今日
3.没有来期小于今日的预订账户
SELECT arr_dt,dpt_dt,acct_no,resv_no FROM rsv_account WHERE acct_stus='RSV' AND arr_dt<今日
4.没有来期大于今日的在店账户
SELECT arr_dt,dpt_dt,acct_no,resv_no FROM rsv_account WHERE acct_stus='STY' AND arr_dt>今日
5.每个账户至少有一个住店客人,且账户表里的住店客人ID对应的存在
SELECT resv_no,acct_no,acct_stus FROM rsv_account WHERE acct_stus IN ('RSV','STY','WAT') AND resv_no NOT IN ( SELECT DISTINCT(M.resv_no) FROM rsv_account M INNER JOIN rsv_account_guest D ON M.resv_no=D.resv_no AND M.acct_no=D.acct_no WHERE acct_stus IN ('RSV','STY','WAT') AND guest_flg='RE' ORDER BY M.resv_no)
6.每个账户只能有一个预订人,且账户表里的预订人ID对应的存在
(SELECT guest_id FROM rsv_account m INNER JOIN rsv_account_guest d ON m.resv_no=d.resv_no AND m.bkguest_id=d.guest_id WHERE acct_stus IN ('RSV','STY','WAT') AND guest_flg='BK'
ORDER BY m.resv_no,d.acct_no)
SELECT acct_stus,resv_no,acct_no FROM rsv_account WHERE acct_stus IN ('RSV','STY','WAT') AND acct_no IN ( SELECT d.acct_no FROM rsv_account m INNER JOIN rsv_account_guest d ON m.resv_no=d.resv_no AND m.acct_no=d.acct_no WHERE acct_stus IN ('RSV','STY','WAT') AND guest_flg='BK' GROUP BY d.acct_no HAVING COUNT(*)>1)
账务 financial_test001 financial_test002
1.客账交易金额与账务明细金额一致,12个细项金额也一致
金额一致:
SELECT * from (SELECT mtrn_id,SUM(trntot_amt) as amt1 FROM hpt_fin_transaction GROUP BY mtrn_id) A, (SELECT trn_id,SUM(trn_amt) as amt2 FROM hpt_fin_transaction_jrnl WHERE jrnl_typ='REVN' GROUP BY trn_id) B WHERE A.mtrn_id=B.trn_id AND amt1<>amt2
细项一致:
SELECT * FROM (SELECT mtrn_id,acct_no,room_num,trn_cd,trn_drpt,trntot_amt AS amt1,trn_net+trn_tax1+trn_tax2+trn_tax3+trn_tax4+trn_tax5+trnsvc_net+trnsvc_tax1+trnsvc_tax2+trnsvc_tax3+trnsvc_tax4+trnsvc_tax5 AS amt2 FROM hpt_fin_transaction) A WHERE A.amt1<>A.amt2
2.账单的余额为0
SELECT acct_no,bill_no,SUM(trntot_amt) from hpt_fin_transaction WHERE COALESCE(bill_no,'')<>'' GROUP BY acct_no,bill_no HAVING SUM(trntot_amt)>0 ORDER BY acct_no
3.已结账户余额为0
SELECT a.acct_no,SUM(trntot_amt) from rsv_account a LEFT JOIN hpt_fin_transaction t ON a.acct_no=t.acct_no WHERE a.acct_stus='OUT' GROUP BY a.acct_no HAVING SUM(trntot_amt)>0
4.结账folio里的几个金额与明细一致
SELECT F.acct_no,F.folio_no,credit_amt,debit_amt,check_amt,T.acct_no,T.bill_no,T.normal,trnamt FROM hpt_fin_folio F LEFT JOIN (SELECT acct_no,bill_no,normal,sum(trntot_amt) AS trnamt FROM hpt_fin_transaction WHERE bill_no<>'' GROUP BY acct_no,bill_no,normal ORDER BY acct_no,bill_no) T ON F.acct_no=T.acct_no AND F.folio_no=T.bill_no WHERE F.folio_typ='BILL' AND COALESCE(credit_amt,0)<>COALESCE(debit_amt,0) OR CASE T.normal WHEN 'C' THEN COALESCE(debit_amt,0)<>trnamt WHEN 'D' THEN COALESCE(credit_amt,0)<>trnamt ELSE 1=1 END
5.转账folio里的几个金额与明细一致
SELECT F.acct_no,F.folio_typ,F.folio_no,credit_amt,debit_amt,check_amt,J.trn_amt from hpt_fin_folio F LEFT JOIN (SELECT acct_no,pkgfolio_no,sum(trn_amt) AS trn_amt FROM hpt_fin_transaction_jrnl WHERE jrnl_typ='MOVE' GROUP BY acct_no,pkgfolio_no ORDER BY acct_no,pkgfolio_no) J ON F.acct_no=J.acct_no AND F.folio_no=J.pkgfolio_no WHERE F.folio_typ='MVIN' OR F.folio_typ='MVOUT' AND (COALESCE(credit_amt,0)+COALESCE(debit_amt,0)<>COALESCE(check_amt,0) OR COALESCE(check_amt,0)<>COALESCE(trn_amt,0))
SELECT F.acct_no,F.folio_typ,F.folio_no,credit_amt,debit_amt,check_amt,J.normal,J.trn_amt from hpt_fin_folio F LEFT JOIN (SELECT acct_no,pkgfolio_no,normal,sum(trn_amt) AS trn_amt FROM hpt_fin_transaction_jrnl WHERE jrnl_typ='MOVE' GROUP BY acct_no,pkgfolio_no,normal ORDER BY acct_no,pkgfolio_no,normal) J ON F.acct_no=J.acct_no AND F.folio_no=J.pkgfolio_no WHERE F.folio_typ='MVIN' OR F.folio_typ='MVOUT' AND CASE J.normal WHEN 'C' THEN COALESCE(credit_amt,0)<>J.trn_amt WHEN 'D' THEN COALESCE(debit_amt,0)<>J.trn_amt ELSE 1=1 END
客房 hotelroom_test001 hotelroom_test002
1.空房态没有在店账户
SELECT arr_dt,dpt_dt,resv_no,acct_no,room_num FROM rsv_account WHERE acct_stus='STY' AND room_num IN (SELECT room_num FROM hpt_hk_room WHERE fo_room_stus='V')
2.占用房态必有在店账户
SELECT arr_dt,dpt_dt,resv_no,acct_no,room_num FROM rsv_account WHERE acct_stus='STY' AND room_num IN (SELECT room_num FROM hpt_hk_room WHERE fo_room_stus<>'O')
3.维修房态有对应的维修记录
SELECT room_num FROM hpt_hk_room WHERE room_stus='OOO' AND room_num NOT IN (SELECT room_num FROM hpt_hk_room_repair WHERE repair_typ='OOO' AND start_dt<=当日 AND end_dt>=当日)
apache-tomcat-9.0.0.M20
zookeeper-3.4.8
rabbitMq-3.6.1
erlang-18.3
redis-3.2.1
FastDFS-5.05
PostgreSQL 9.6.1
Node 6.9.1 NPM 3.10.10
[图片上传失败...(image-ad7bda-1510734227417)]
PostgreSQL自带一个客户端pgAdmin,里面有个备份,恢复选项,也能对数据库进行备份 恢复(还原),但最近发现数据库慢慢庞大的时候,经常出错,备份的文件过程中出错的几率那是相当大,手动调节灰常有限。所以一直寻找完美的备份恢复方案。
一: 纯文件格式的脚本:
示例:
1. 只导出postgres数据库的数据,不包括模式 -s
pg_dump -U postgres -f /postgres.sql -s postgres(数据库名)
2. 导出postgres数据库(包括数据)
pg_dump -U postgres -f /postgres.sql postgres(数据库名)
3. 导出postgres数据库中表test01的数据
create database "test01" with owner="postgres" encoding='utf-8';(单引号,双引号不能错)
pg_dump -U postgres -f /postgres.sql -t test01 postgres(数据库名)
4. 导出postgres数据库中表test01的数据,以insert语句的形式
pg_dump -U postgres -f /postgres.sql -t test01 --column-inserts postgres(数据库名)
5. 恢复数据到bk01数据库
psql -U postgres -f /postgres.sql bk01
二、 使用归档文件格式:
pg_restore
使用pg_restore纯文本恢复纯文本格式的脚本,无法恢复
[root@localhost postgres-9.3.5]# pg_restore -U postgres -d bk01 /mnt/hgfs/window&ubuntu\ shared\ folder/vendemo.sql
pg_restore: [archiver] input file appears to be a text format dump. Please use psql.
pg_restore和归档文件格式一起使用重建数据库。
1. 先备份:
pg_dump -U postgres -F t -f /vendemo.tar vendemo 备份下来有800多k
. 恢复:
pg_restore -U postgres -d bk01 /vendemo.tar
2. 先备份:
pg_dump -U postgres -F c -f /vendemo.tar vendemo 备份下来有300多k
. 恢复:
pg_restore -U postgres -d bk01 /vendemo.tar
三、 压缩备份与恢复:
处理
大数据
库:
1. 使用压缩的转储. 使用你熟悉的压缩程序,比如说 gzip。
. 先备份:
pg_dump -U postgres vendemo | gzip > /vendemo.gz 备份下来只有30多k
. 恢复:
gunzip -c /vendemo.gz | psql -U postgres bk02
或者
cat /vendemo.gz | gunzip | psql -U postgres bk02
2. 使用 split。. split 命令允许你 你用下面的方法把输出分解成
操作系统
可以接受的大小。 比如,让每个块大小为 1 兆字节:
. 先备份:
pg_dump -U postgres -d vendemo | split -b 100k - /vend/vend
导出来的样子是 vendaa 100k
vendab 100k
vendac 100k
vendad 16k
. 恢复:
cat /vend/vend* | psql -U postgres bk02
梦里寻他千百度,伊人却在灯火阑珊处...其实PostgreSQL内置不少的工具,寻找的备份恢复方案就在其中:pg_dump,psql。这两个指令 在数据库的安装目录下,比如我自己本地安装的,路径形如:C:\Program Files\PostgreSQL\9.5\;然后进入到bin文件夹,会看到不少的exe文件,这就是PostgreSQL内置的工具了。里面会找到 pg_dump.exe,psql.exe两个文件。我们怎么用他们?
用法:
备份数据库
,指令如下:
pg_dump -h 164.82.233.54 -U postgres databasename > C:\databasename.bak
开始-运行-cmd 弹出dos控制台;然后 在控制台里,进入PostgreSQL安装目录bin下:
cd C:\Program Files\PostgreSQL\9.0\bin
最后执行备份指令:
pg_dump -h 164.82.233.54 -U postgres databasename > C:\databasename.bak
指令解释:如上命令,pg_dump 是备份数据库指令,164.82.233.54是数据库的ip地址(必须保证数据库允许外部访问的权限哦~),当然本地的数据库ip写 localhost;postgres 是数据库的用户名;databasename 是数据库名。> 意思是导出到C:\databasename.bak文件里,如果没有写路径,单单写databasename.bak文件名,那么备份文件会保存在C: \Program Files\PostgreSQL\9.0\bin 文件夹里。
恢复数据库 ,指令如下:
**psql -h localhost -U postgres -d databasename < C:\databasename.bak(测试没有成功)pg_restore.exe --host localhost --port 5432 --username "postgres" --dbname "symbolmcnew" --no-password --verbose "databasename.backup"(测试成功)**
指令解释:如上命令,psql是恢复数据库命令,localhost是要恢复到哪个数据库的地址,当然你可以写上ip地址,也就是说能远程恢复(必须保证 数据库允许外部访问的权限哦~);postgres 就是要恢复到哪个数据库的用户;databasename 是要恢复到哪个数据库。< 的意思是把C:\databasename.bak文件导入到指定的数据库里。
以上所有的是针对windows而言的,如果在linux下,会不会有效?
在linux里依然有效。有一个值得注意的是:如果直接进入PostgreSQL的安装目录bin下,执行命令,可能会出现 找不到pg_dump,psql�的现象,我们在可以这样:
备份 :
/opt/PostgreSQL/9.5/bin/pg_dump -h 164.82.233.54 -U postgres databasename > databasename.bak
恢复
:
/opt/PostgreSQL/9.5/bin/psql -h localhost -U postgres -d databasename < databasename.bak
##########################MYSQL DUMP Restore###############################
mysqldump命令式备份整个DB用的。
shell>mysqldump *
db_name* > *
backup-file.sql*
把备份的数据导入空数据库的命令。
shell>mysql *
db_name* < *
backup-file.sql*
或者下面的这个命令。
shell>mysql -e "source *
/path-to-backup/backup-file.sql*" *
db_name*
在使用上面的命令的时候有可能会报版本不对。
原因是Linux中mysql命令的版本和你想导入的那个数据库的版本不一致。
变通做法是跑到数据库的bin目录下面。
sshell> ./mysqldump *
db_name* > *
backup-file.sql*
把备份的数据导入空数据库的命令。
shell> ./mysql *
db_name* < *
backup-file.sql*
apache-tomcat-9.0.0.M20
zookeeper-3.4.8
rabbitMq-3.6.1
erlang-18.3
redis-3.2.1
FastDFS-5.05
PostgreSQL 9.6.1
Node 6.9.1 NPM 3.10.10
[图片上传中...(image-2435c1-1510734229120-0)]
PostgreSQL自带一个客户端pgAdmin,里面有个备份,恢复选项,也能对数据库进行备份 恢复(还原),但最近发现数据库慢慢庞大的时候,经常出错,备份的文件过程中出错的几率那是相当大,手动调节灰常有限。所以一直寻找完美的备份恢复方案。
一: 纯文件格式的脚本:
示例:
1. 只导出postgres数据库的数据,不包括模式 -s
pg_dump -U postgres -f /postgres.sql -s postgres(数据库名)
2. 导出postgres数据库(包括数据)
pg_dump -U postgres -f /postgres.sql postgres(数据库名)
3. 导出postgres数据库中表test01的数据
create database "test01" with owner="postgres" encoding='utf-8';(单引号,双引号不能错)
pg_dump -U postgres -f /postgres.sql -t test01 postgres(数据库名)
4. 导出postgres数据库中表test01的数据,以insert语句的形式
pg_dump -U postgres -f /postgres.sql -t test01 --column-inserts postgres(数据库名)
5. 恢复数据到bk01数据库
psql -U postgres -f /postgres.sql bk01
二、 使用归档文件格式:
pg_restore
使用pg_restore纯文本恢复纯文本格式的脚本,无法恢复
[root@localhost postgres-9.3.5]# pg_restore -U postgres -d bk01 /mnt/hgfs/window&ubuntu\ shared\ folder/vendemo.sql
pg_restore: [archiver] input file appears to be a text format dump. Please use psql.
pg_restore和归档文件格式一起使用重建数据库。
1. 先备份:
pg_dump -U postgres -F t -f /vendemo.tar vendemo 备份下来有800多k
. 恢复:
pg_restore -U postgres -d bk01 /vendemo.tar
2. 先备份:
pg_dump -U postgres -F c -f /vendemo.tar vendemo 备份下来有300多k
. 恢复:
pg_restore -U postgres -d bk01 /vendemo.tar
三、 压缩备份与恢复:
处理
大数据
库:
1. 使用压缩的转储. 使用你熟悉的压缩程序,比如说 gzip。
. 先备份:
pg_dump -U postgres vendemo | gzip > /vendemo.gz 备份下来只有30多k
. 恢复:
gunzip -c /vendemo.gz | psql -U postgres bk02
或者
cat /vendemo.gz | gunzip | psql -U postgres bk02
2. 使用 split。. split 命令允许你 你用下面的方法把输出分解成
操作系统
可以接受的大小。 比如,让每个块大小为 1 兆字节:
. 先备份:
pg_dump -U postgres -d vendemo | split -b 100k - /vend/vend
导出来的样子是 vendaa 100k
vendab 100k
vendac 100k
vendad 16k
. 恢复:
cat /vend/vend* | psql -U postgres bk02
梦里寻他千百度,伊人却在灯火阑珊处...其实PostgreSQL内置不少的工具,寻找的备份恢复方案就在其中:pg_dump,psql。这两个指令 在数据库的安装目录下,比如我自己本地安装的,路径形如:C:\Program Files\PostgreSQL\9.5\;然后进入到bin文件夹,会看到不少的exe文件,这就是PostgreSQL内置的工具了。里面会找到 pg_dump.exe,psql.exe两个文件。我们怎么用他们?
用法:
备份数据库
,指令如下:
pg_dump -h 164.82.233.54 -U postgres databasename > C:\databasename.bak
开始-运行-cmd 弹出dos控制台;然后 在控制台里,进入PostgreSQL安装目录bin下:
cd C:\Program Files\PostgreSQL\9.0\bin
最后执行备份指令:
pg_dump -h 164.82.233.54 -U postgres databasename > C:\databasename.bak
指令解释:如上命令,pg_dump 是备份数据库指令,164.82.233.54是数据库的ip地址(必须保证数据库允许外部访问的权限哦~),当然本地的数据库ip写 localhost;postgres 是数据库的用户名;databasename 是数据库名。> 意思是导出到C:\databasename.bak文件里,如果没有写路径,单单写databasename.bak文件名,那么备份文件会保存在C: \Program Files\PostgreSQL\9.0\bin 文件夹里。
恢复数据库 ,指令如下:
**psql -h localhost -U postgres -d databasename < C:\databasename.bak(测试没有成功)pg_restore.exe --host localhost --port 5432 --username "postgres" --dbname "symbolmcnew" --no-password --verbose "databasename.backup"(测试成功)**
指令解释:如上命令,psql是恢复数据库命令,localhost是要恢复到哪个数据库的地址,当然你可以写上ip地址,也就是说能远程恢复(必须保证 数据库允许外部访问的权限哦~);postgres 就是要恢复到哪个数据库的用户;databasename 是要恢复到哪个数据库。< 的意思是把C:\databasename.bak文件导入到指定的数据库里。
以上所有的是针对windows而言的,如果在linux下,会不会有效?
在linux里依然有效。有一个值得注意的是:如果直接进入PostgreSQL的安装目录bin下,执行命令,可能会出现 找不到pg_dump,psql�的现象,我们在可以这样:
备份 :
/opt/PostgreSQL/9.5/bin/pg_dump -h 164.82.233.54 -U postgres databasename > databasename.bak
恢复
:
/opt/PostgreSQL/9.5/bin/psql -h localhost -U postgres -d databasename < databasename.bak
##########################MYSQL DUMP Restore###############################
mysqldump命令式备份整个DB用的。
shell>mysqldump *
db_name* > *
backup-file.sql*
把备份的数据导入空数据库的命令。
shell>mysql *
db_name* < *
backup-file.sql*
或者下面的这个命令。
shell>mysql -e "source *
/path-to-backup/backup-file.sql*" *
db_name*
在使用上面的命令的时候有可能会报版本不对。
原因是Linux中mysql命令的版本和你想导入的那个数据库的版本不一致。
变通做法是跑到数据库的bin目录下面。
sshell> ./mysqldump *
db_name* > *
backup-file.sql*
把备份的数据导入空数据库的命令。
shell> ./mysql *
db_name* < *
backup-file.sql*
######################################################################
Git GitFlow SVN
http://svnbook.red-bean.com/
##############################SVN 规范标准###################################
Subversion有一个很标准的目录结构,是这样的。
比如项目是proj,svn地址为svn://proj/,那么标准的svn布局是
svn://proj/
|
+-trunk
+-branches
+-tags
这是一个标准的布局,trunk为主开发目录,branches为分支开发目录,tags为tag存档目录(不允许修改)。但是具体这几个目录应该如何使用,svn并没有明确的规范,更多的还是用户自己的习惯。
对于这几个开发目录,一般的使用方法有两种。我更多的是从软件产品的角度出发(比如freebsd),因为互联网的开发模式是完全不一样的。
第一种方法,使用trunk作为主要的开发目录。
一般的,我们的所有的开发都是基于trunk进行开发,当一个版本/release开发告一段落(开发、测试、文档、制作安装程序、打包等)结束后,代码处于冻结状态(人为规定,可以通过hook来进行管理)。此时应该基于当前冻结的代码库,打tag。当下一个版本/阶段的开发任务开始,继续在trunk进行开发。
此时,如果发现了上一个已发行版本(Released Version)有一些bug,或者一些很急迫的功能要求,而正在开发的版本(Developing Version)无法满足时间要求,这时候就需要在上一个版本上进行修改了。应该基于发行版对应的tag,做相应的分支(branch)进行开发。
例如,刚刚发布1.0,正在开发2.0,此时要在1.0的基础上进行bug修正。
按照时间的顺序
- 1.0开发完毕,代码冻结
- 基于已经冻结的trunk,为release1.0打tag
此时的目录结构为
svn://proj/
+trunk/ (freeze)
+branches/
+tags/
+tag_release_1.0 (copy from trunk) - 2.0开始开发,trunk此时为2.0的开发版
- 发现1.0有bug,需要修改,基于1.0的tag做branch
此时的目录结构为
svn://proj/
+trunk/ ( dev 2.0 )
+branches/
+dev_1.0_bugfix (copy from tag/release_1.0)
+tags/
+release_1.0 (copy from trunk) - 在1.0 bugfix branch进行1.0 bugfix开发,在trunk进行2.0开发
- 在1.0 bugfix 完成之后,基于dev_1.0_bugfix的branch做release等
- 根据需要选择性的把dev_1.0_bugfix这个分支merge回trunk(什么时候进行这步操作,要根据具体情况)
这是一种很标准的开发模式,很多的公司都是采用这种模式进行开发的。trunk永远是开发的主要目录。
第二种方法,在每一个release的branch中进行各自的开发,trunk只做发布使用。
这种开发模式当中,trunk是不承担具体开发任务的,一个版本/阶段的开发任务在开始的时候,根据已经release的版本做新的开发分支,并且基于这个分支进行开发。还是举上面的例子,这里面的时序关系是。
- 1.0开发,做dev1.0的branch
此时的目录结构
svn://proj/
+trunk/ (不担负开发任务 )
+branches/
+dev_1.0 (copy from trunk)
+tags/ - 1.0开发完成,merge dev1.0到trunk
此时的目录结构
svn://proj/
+trunk/ (merge from branch dev_1.0)
+branches/
+dev_1.0 (开发任务结束,freeze)
+tags/ - 根据trunk做1.0的tag
此时的目录结构
svn://proj/
+trunk/ (merge from branch dev_1.0)
+branches/
+dev_1.0 (开发任务结束,freeze)
+tags/
+tag_release_1.0 (copy from trunk) - 1.0开发,做dev2.0分支
此时的目录结构
svn://proj/
+trunk/
+branches/
+dev_1.0 (开发任务结束,freeze)
+dev_2.0 (进行2.0开发)
+tags/
+tag_release_1.0 (copy from trunk) - 1.0有bug,直接在dev1.0的分支上修复
此时的目录结构
svn://proj/
+trunk/
+branches/
+dev_1.0 (1.0bugfix)
+dev_2.0 (进行2.0开发)
+tags/
+tag_release_1.0 (copy from trunk) - 选择性的进行代码merge
这其实是一种分散式的开发,当各个部分相对独立一些(功能性的),可以开多个dev的分支进行开发,这样各人/组都不会相互影响。比如dev_2.0_search和dev_2.0_cache等。但是这样merge起来就是一个很痛苦的事情。
这里要注意一下的,第六步进行选择性的merge,是可以当2.0开发结束后一起把dev_1.0(bugfix用)和dev_2.0(新版本开发用)merge回trunk。或者先把dev_1.0 merge到dev_2.0,进行测试等之后再merge回trunk。
这两种方法各有利弊,第一种方法是可以得到一个比较纯的dev_2.0的开发分支,而第二种方法则更加的保险,因为要测试嘛。
以上呢,就是我说的两种开发模式了,具体哪种好,并没有定论。这里大致的说一下各自的优缺点
第一种开发模式(trunk进行主要开发,集中式):
优点:管理简单
缺点:当开发的模块比较多,开发人数/小团队比较多的时候,很容易产生冲突而影响对方的开发。因为所有的改动都有可能触碰对方的改动
第二种开发模式(分支进行主要开发,分散式):
优点:各自开发独立,不容易相互影响。
缺点:管理复杂,merge的时候很麻烦,容易死人