架构:c/s
开发语言:python
服务器端:在linux平台下部署
客户端:分gui与cli两种操作界面
相关包:
http://blog.sina.com.cn/s/blog_53b95aec0100ga3x.html svn 出错信息总汇
http://blog.csdn.net/daniel_h1986/article/details/8159811 SVN分支/合并原理及最佳实践
一种典型的项目代码实践方式是:
存在一个代码基线(Base Line)或称主干,不同的模块使用各自的分支进行功能开发,在开发完毕后合并回主干,准备交付。
20.版本库的存储
唯一真正对FSFS不利的是相对于Berkeley DB的不成熟,缺乏足够的使用和压力测试,许多关于速度和可扩展性的判断都是建立在良好的猜测之上。在理论上,它承诺会降低管理员新手的门槛并且更加不容易发生问题。在实践中,只有时间可以证明。
总之,这两个中并没有一个是更正式的,访问版本库的程序与采用哪一种实现方式无关。通过上文和下表(从总体上比较了Berkeley DB和FSFS版本库),读者可以自行选择自己需要的存储方式
subversion-1.6.11 采用python2.6开发,存储使用BDB
svn服务器有2种运行方式:独立服务器和借助apache等web服务器。两种方式各有利弊。svn存储版本数据也有2种方式:BDB和FSFS。因为BDB方式在服务器中断时,有可能锁住数据,所以还是FSFS方式更安全一点。Subversion 的版本库(repository),就是位于服务器端,统一管理和储存数据的地方。要创建一个版本库,首先要确定采用哪种数据存储方式。在 Subversion 中,版本库的数据存储有两种方式,一种是在 Berkeley DB 数据库中存放数据;另一种是使用普通文件,采用自定义的格式来储存,称为 FSFS。
那你应该用什么服务器?什么最好?
显然,对这个问题没有正确的答案,每个团队都有不同的需要,不同的服务器都有各自的代价。Subversion项目没有更加认可哪种服务,或认为哪个服务更加“正式”一点。
下面是你选择或者不选择某一个部署方式的原因。
简单地说,SVN+SSH (SVN over SSH) 协议的工作方式就是在SVN客户端与服务器端先建立一个SSH连接,然后通过SSH连接推送命令和传输数据,从而借助SSH实现更加安全的SVN通信。使用SVN+SSH方式访问Repository,与普通的http或https方式最大的不同,或者说仅有的不同就是通过SSH安全认证登录到远程主机建立SSH连结,如果这一步完成了,剩下的就是纯SVN操作了。http://blog.csdn.net/bluishglc/article/details/8705864
linux(Centos6)安装SVN支持svn和svn+ssh方式
All Subversion protocols are supported
http://www.subversion.org.cn/svnbook/1.4/index.html
http://www.subversion.org.cn/
建立版本库
配置用户与权限
运行独立服务器
初始化导入
基本客户端操作
取出一个workcopy
修改并提交
查看修改
[root@svnserv svnconf]# svn --version
svn, version 1.6.11 (r934486)
compiled Mar 5 2014, 14:32:27
Copyright (C) 2000-2009 CollabNet.
Subversion is open source software, see http://subversion.tigris.org/
This product includes software developed by CollabNet (http://www.Collab.Net/).
The following repository access (RA) modules are available:
* ra_neon : Module for accessing a repository via WebDAV protocol using Neon.
- handles 'http' scheme
- handles 'https' scheme
* ra_svn : Module for accessing a repository using the svn network protocol.
- with Cyrus SASL authentication
- handles 'svn' scheme
* ra_local : Module for accessing a repository on local disk.
- handles 'file' scheme
源码安装
http://subversion.tigris.org/downloads/subversion-1.4.0.tar.gz
http://subversion.tigris.org/downloads/subversion-deps-1.4.0.tar.gz
编译:
以root用户登录。
将subversion-1.4.0.tar.gz和subversion-deps-1.4.0.tar.gz传到服务器。
tar xfvz subversion-1.4.0.tar.gz
tar xfvz subversion-deps-1.4.0.tar.gz
subversion-deps包有四个目录zlib apr apr-util neon这四个目录都是依赖包,编译subversion所必须的代码
cd subversion-1.4.0
./configure –prefix=/opt/svn –without-berkeley-db –with-zlib
(注:以svnserve方式运行,不加apache编译参数。以fsfs格式存储版本库,不编译berkeley-db)
make clean
make
make install
vi /etc/profile,在/etc/profile最后加入:
PATH=$PATH:/opt/svn/bin
export PATH
测试:
svnserve –version
如果显示如下,安装成功:
启动svn
建立启动svn的用户:
useradd svn
passwd svn
根据提示为用户svn设置密码
允许用户svn访问版本库:
chown -R svn:svn /opt/svndata
chown -R svn:svn /opt/data
启动svn:
su - svn -c “svnserve -d –listen-port 9999 -r /opt/svndata”
其中:
su - svn表示以用户svn的身份启动svn
-d表示以daemon方式(后台运行)运行
–listen-port 9999表示使用9999端口,可以换成你需要的端口。但注意,使用1024以下的端口需要root权限
-r /opt/svndata指定根目录是/opt/svndata
检查:
ps -ef|grep svnserve
如果显示如下,即为启动成功:
svn 6941 1 0 15:07 ? 00:00:00 svnserve -d –listen-port 9999 -r /opt/svndata
注意:
* 权限配置文件中出现的用户名必须已在用户配置文件中定义。
* 对权限配置文件的修改立即生效,不必重启svn。
yum安装
安装(centos下yum即可方便的完成安装)
# yum install subversion
测试安装是否成功:
# svnserve --version 回车显示版本说明安装成功
http://tortoisesvn.net/downloads.html 客户端乌龟
http://www.cnblogs.com/wrmfw/archive/2011/09/08/2170465.html
[root@localhost ~]# svnadmin create --fs-type bdb /root/aa
svnadmin: Repository creation failed
svnadmin: Could not create top-level directory
svnadmin: '/root/aa' exists and is non-empty
[root@localhost ~]# mkdir svnrepo
[root@localhost ~]# svnadmin create --fs-type bdb /root/svnrepo/
[root@localhost conf]# vi svnserve.conf
[svnrepo]
anon-access = read
auth-access = write
password-db = passwd
authz-db = authz
realm = svnrepo
[root@localhost conf]# vi passwd
fgy = fgy
[root@localhost conf]# vi authz
[/]
fgy = rw
[root@localhost conf]# killall svnserve
[root@localhost conf]# svnserve -d -r /root/svnrepo/
配置SVN服务器的HTTP支持
配置邮件提醒支持
etc/rc.d/init.d/svnserve
etc/subversion
usr/bin/svn
usr/bin/svnadmin
usr/bin/svndumpfilter
usr/bin/svnlook
usr/bin/svnserve
usr/bin/svnsync
usr/bin/svnversion
# 创建文件夹
$ mkdir /etc/svn/repos
# 运行创建版本库的命令,指定数据存储为 FSFS,如果要指定为 Berkeley DB,则将 fsfs 替换为 bdb
$ svnadmin create --fs-type fsfs /etc/svn/repos
172.16.1.9 svn-server
/usr/bin/svnserve -d -r /home/svnroot
启动服务器
# svnserve -d -r /svndata
-d表示以daemon方式(后台运行)运行
-r /svndata指定根目录是/svndata
关闭SVN 服务器
# killall svnserve
# ps aux | grep svnserve 查看服务,端口:3690
每个版本库创建之后都会生成svnserve.conf主配文件
cat /home/svnroot/flt8a-2-server/conf/svnserve.conf
realm =kuming 库名
其中一个版本库
/home/svnroot/flt-oa
drwxr-xr-x 2 root root 4096 Jul 23 2013 conf
drwxr-sr-x 6 root root 4096 Jun 18 16:39 db
-r--r--r-- 1 root root 2 Jul 23 2013 format
drwxr-xr-x 2 root root 4096 Jul 23 2013 hooks
drwxr-xr-x 2 root root 4096 Jul 23 2013 locks
-rw-r--r-- 1 root root 229 Jul 23 2013 README.txt
[root@svnserv svnconf]# pwd
/home/svnroot/svnconf
-rw-r--r-- 1 svn svn 3958 Jun 9 14:02 authz
-rw-r--r-- 1 svn svn 631 Jun 9 14:03 passwd
# vim /home/svnroot/svnconf/passwd //svn用户配置文件
[users]
user1 = password1
user2 = password2
user3 = password3
user4 = password4
# vim /home/svnroot/svnconf/authz //svn权限控制配置文件
[groups] //设置组
group1 = user1,user2 #多用户用逗号隔开
[/] #根目录权限设置(就是“kuming”这个文件夹)
user3 = rw #用户1权限是:可读写
user4 = r #用户2权限是:可读,不可写
user = #什么都没写代表没有任何权限
@group1 = rw #设置组权限
[kuming:/123] #设置根目录下“123”文件夹的权限
#说明“123”这个文件件怎么创建?这是在SVN服务器配置好之后,创建一个权限很高的用户在客户端登录SVN
#然后创建一个文件夹“123”。
在Windows下推荐使用乌龟(Tortoise)SVN客户端。 TortoiseSVN 是 Subversion 版本控制系统的一个免费开源客户端,可以超越时间的管理文件和目录。文件保存在中央版本库(即SAE中央SVN仓库),除了能记住文件和目录的每次修改以外,版本库非常像普通的文件服务器。你可以将文件恢复到过去的版本,并且可以通过检查历史知道数据做了哪些修改,谁做的修改。这就是为什么许多人将 Subversion 和版本控制系统看作一种“时间机器”。
windows下的TortoiseSVN是资源管理器的一个插件,以覆盖图标表示文件状态,几乎所以命令都有图形界面支持,比较好用,这里就不多说。
(如果是第一次提交文件,很可能会出现“svn:'.'不是工作副本”,即当前目录不是工作副本,这个时候需要用到import:eg:svn import . url)
1、将文件checkout到本地目录
svn checkout path(path是服务器上的目录)
例如:svn checkout svn://192.168.1.1/pro/domain
简写:svn co
如果用户名输错,不能再连接的时候,删除下面的文件即可
[root@CentOS5 flt-oa]# svn co svn://172.16.1.9/flt-oa
[root@CentOS5 svn.simple]# rm -rf /root/.subversion/auth/svn.simple/8cad8fa6684ca29a56e83e7390947c1a
[root@CentOS5 fgy]# svn log flt-oa/index.php
[root@CentOS5 fgy]# svn info index.php
svn help import
http://sae.sina.com.cn
1、从SVN仓库中检索出代码到工作拷贝:
# svn checkout https://svn.sinaapp.com/appname [workcopy]
其中workcopy是可选的,如果不写workcopy,SVN会默认将appname做为workcopy。
如果只检索某个版本:
# svn checkout https://svn.sinaapp.com/appname/appversion [workcopy]
只检索某个版本的某个目录:
# svn checkout https://svn.sinaapp.com/appname/appversion/folder [workcopy]
linux客户端使用
0 查看当前工作目录svn 状态 简写:svn st 1、将文件checkout到本地目录 svn checkout path(path是服务器上的目录) 简写:svn co 2、往版本库中添加新的文件 svn add file 3、将改动的文件提交到版本库 svn commit -m “LogMessage” [-N] [--no-unlock] PATH(如果选择了保持锁,就使用–no-unlock开关) 简写:svn ci 4、加锁/解锁 svn lock -m “LockMessage” [--force] PATH svn unlock PATH 5、更新到某个版本 svn update -r m path 简写:svn up 6、查看文件或者目录状态 1)svn status path(目录下的文件和子目录的状态,正常状态不显示) 2)svn status -v path(显示文件和子目录状态) 简写:svn st 7、删除文件 svn delete path -m “delete test fle” 简写:svn (del, remove, rm) 8、查看日志 svn log path 9、查看文件详细信息 svn info path 10、比较差异 svn diff path(将修改的文件与基础版本比较) svn diff -r m:n path(对版本m和版本n比较差异) 简写:svn di 11、将两个版本之间的差异合并到当前文件 svn merge -r m:n path 12、SVN 帮助 svn help svn help ci [root@c64 build-finished]# svn st svn: warning: '.' is not a working copy [root@c64 build-finished]# mkdir web [root@c64 build-finished]# svn co svn://172.16.1.9/flt8a-2-server/webserver/trunk /root/newbuild/build-finished/web [root@c64 web]# svn help usage: svn <subcommand> [options] [args] Subversion command-line client, version 1.6.11. Type 'svn help <subcommand>' for help on a specific subcommand. Type 'svn --version' to see the program version and RA modules or 'svn --version --quiet' to see just the version number. Most subcommands take file and/or directory arguments, recursing on the directories. If no arguments are supplied to such a command, it recurses on the current directory (inclusive) by default. [root@c64 web]# svn info Path: . URL: svn://172.16.1.9/flt8a-2-server/webserver/trunk Repository Root: svn://172.16.1.9/flt8a-2-server Repository UUID: e452d122-dd6b-4849-94b0-2d396b7a452b Revision: 2670 Node Kind: directory Schedule: normal [root@c64 web]# svn ls .htaccess application/ attach cache/ data/ favicon.ico getRoute.php index.php load_data.sh shellext/ sqlnet.log system/ tcp.php upfile/ welcome.html [root@c64 web]# svn log -v|more ------------------------------------------------------------------------ r2670 | deravo | 2015-05-20 09:24:59 +0800 (Wed, 20 May 2015) | 1 line Changed paths: M /webserver/trunk/application/models/api/mod_rep_org.php ------------------------------------------------------------------------ r2669 | deravo | 2015-05-19 17:32:52 +0800 (Tue, 19 May 2015) | 1 line Changed paths: M /webserver/trunk/application/controllers/api/Relation/CarAndDriver/Get.php ------------------------------------------------------------------------ r2668 | deravo | 2015-05-19 17:30:58 +0800 (Tue, 19 May 2015) | 1 line Changed paths: M /webserver/trunk/application/controllers/api/BasicInfo/Vehicle/Del.php [root@c64 web]# svn log -v -r 2386 ------------------------------------------------------------------------ r2386 | deravo | 2015-01-15 17:22:24 +0800 (Thu, 15 Jan 2015) | 1 line Changed paths: M /webserver/trunk/application/controllers/api/Alarm/Action/act_Deal_Realtime_Result.php M /webserver/trunk/application/models/api/mod_alarm.php ------------------------------------------------------------------------ [root@c64 web]# svn up At revision 2670. [root@c64 web]# svn up A 新建文本文档.txt Updated to revision 2671. [root@c64 web]# svn st --show-updates Status against revision: 2671 [root@c64 api]# pwd /root/newbuild/build-finished/web/application/models/api [root@c64 api]# svn di -r 2640:2670 mod_org.php Index: mod_org.php =================================================================== --- mod_org.php (revision 2640) +++ mod_org.php (revision 2670) @@ -91,7 +91,8 @@ NULL TRANSPORT_NUM, NVL(VEHICLE_COUNT, 0) VEHICLE_COUNT, NVL(ONLINE_COUNT, 0) ONLINE_COUNT, - PLATE_SHOW_TYPE")->from(" + PLATE_SHOW_TYPE, + MONITOR_TYPE")->from(" (SELECT * FROM ORG_INFO WHERE ORG_ID = 120000 ) OI LEFT JOIN (
SVN服务器版本库有两种格式,
一种为FSFS,
一种为BDB
把文件上传到SVN版本库后,上传的文件不再以文件原来的格式存储,而是被svn以它自定义的格式压缩成版本库数据,存放在版本库中。
如果是FSFS格式,这些数据存放在版本库的db目录中,里面的revs和revprops分别存放着每次提交的差异数据和日志等信息