一、版本管理
首先来聊一聊版本管理,版本管理源于工程设计领域,能追踪工程蓝图从诞生到定案的整个过程(其实由于软件行业本来也比较年轻,很多概念都是借鉴其他学科来的嘛)。
在版本管理里有两个版本管理软件比较有名(其他的貌似基本被干掉了),一个是svn,一个是git,不过现在git的流行程度更大了吧,之后打算写一篇总结git的文章。svn是一对多的模式,一个仓库,多个使用节点;git则是多个节点都有仓库,都可以提交更新,总之在数据的安全性上,git占优一点。
svn嘛,前几年挺火的,所以咯,项目的历史版本都在svn上,也不想改了,反正也没出啥问题。
OK,接下来聊聊SVN,这东西全称叫Subversion,又是Apache软件基金会组织下的一个项目,之前有个叫CVS的版本管理工具,svn相当于在cvs的基础上发展而来的。Apache基金会真的牛逼,从tomcat、svn到hadoop都是它的项目。
之前说了SVN的种种用处,其实都是基于它的特性。
二、SVN的特性
1,目录版本控制
简单说就是可以直接按照目录的方式操作版本中的各文件。讲真,我觉得这还挺神奇的,它是怎么实现的呢?
2,原子提交
原子的概念是不是在数据库中听过,没错,就是要么全都提交,要么就全都被撤销。原子被认为是不可分的,所以嘛,不可分的东西,你当然不能提交一部分另一部分又不提交。
3,版本控制的元数据
元数据是什么?这个概念在前端里也有,有个东东叫meta的也是元数据。元数据可以理解成属性的概念,对每个文件和目录都可以有个属性来说明它的情况的。
4,可选的网络层
其实就是指访问svn的服务器是抽象的,可以根据接口设置。
5,一致的数据处理
svn采用一种叫二进制文件差异算法的方式处理二级制和文本数据,保证操作的一致性
6,高效的分支和标签
svn建立分支和标签时就是复制项目,类似于硬链接,所以复制完后,标签和分支的管理就很快了咯。
三、SVN的工作原理
前面比较svn和git时就说过,svn的仓库保留在服务器上,感觉就是一个一对多的 “客户端/服务端” 模型咯(貌似最新的svn也有新的进展,还没研究过),参考下这个图:
它的checkout就是把整个项目下载下来,update就是从服务器中更新不一样的部分,而commit嘛,就是讲本地代码提交上去的咯。
四、subversion的安装
该进入正题了,subversion嘛最新的更新都到了2018-10-02了,也是厉害,更新地很快的啦,说明还是有用的价值嘛。
因为实际上公司的svn版本也有点老了,所以就用老版本的做总结了
然后就会在系统的环境变量中加入svn的exe地址:
安装完成后输入 svn --version 获取版本信息:
svn,版本 1.8.9 (r1591380)
编译于 May 7 2014,11:00:25 在 x86-microsoft-windows
五、SVN的使用
1,创建版本库:
svnadmin create D:\test\svnTest\svn_repo\oa -- 之后会在该目录下创建一个oa仓库
在仓库下有如下目录:
conf目录放的是和当前版本不相关的一些目录,db是数据库的意思,实际上svn也是通过数据库保存版本信息的!数据库真是有用~这个hooks很有意思,一提交它会触发一个时间,是不是很像触发器?它是用c写的,有空研究底层的时候做个深入分析。
2,启动服务器端程序
svnserve -d -r D:\test\svnTest\svn_repo\oa
参数说明:
参数3为版本库的目录。
这个命令就是说在后台执行D:\test\svnTest\svn_repo\oa 这个版本库咯
好了,是不是启起来了呢?由于svn服务监听的事3390端口,我用netstat查一下看看:
netstat -an
确实是有的哦!实验成功!
这种启动方式,只是演示啦,linux下直接启动,就一直挂着就好了。
好,来个新知识!如何将svn添加到服务里?我用服务来启动!
C:\Users\Administrator>sc create SVNService binpath= "D:\Program Files\bin\svnserve.exe --service -r D:\test\svnTest\svn_repo" start= auto depend= Tcpip
创建成功了!我们来看下服务是否真的有了:
有了!!
创建服务的过程很有意思,原来这样就可以搞定一个服务啦!
参数来说明一下:sc 是service control的缩写,表示服务控制,create表示创建服务,binpath就是要开启的服务的exe所在路径咯,start= auto表示自动启动的啦,depend就是依赖的意思。SVN服务可是要tcpip的支持呢!
这个binpath里呢,--service表示以服务方式启动Subversion,-r表示版本库根目录
只要启动这个服务就可以啦,用命令行就是sc start 服务名。启动完之后再看下端口,3390启动了就成功了。
因为是实验的嘛,这个服务之后也是可以删掉的啦。sc stop 服务名 停掉, sc delete 服务名 删掉
3,checkout的使用
svn服务开启的状态下,使用如下命令(本地进行演示):
D:\test\client>svn checkout svn://localhost/oa
会在命令行中说明取出的版本。
在如上情况下,会生成一个oa项目的哦:
在oa中有一个.svn文件,保存了一些版本库信息
4,客户端上传文件
现在该目录下新建一个txt
命令行中输入:D:\test\client\oa>svn commit helloSVN.txt
然后报错了:
因为要先添加才能commit!
命令行中输入: D:\test\client\oa> svn add helloSVN.txt
下面的 A。。。 表示当前文件的状态,A表示刚刚加入版本控制
然后再commit,还是报错:
这是为什么呢?原来是要有一个commit的信息,不然版本库是不认的哦。有用过git的同学,估计已经看出来了,这两个命令竟然是一模一样的!
好了,修改一下commit命令:svn commit -m "My first commit" helloSVN.txt
猜一下能成功吗?当然不能咯,用过git都知道,提交可是要账号密码的,不然谁都提交,哪个才是正式版本呀?!:
5,SVN权限讲解
代开oa版本库的svnserve.conf:
来看下它的配置,看到了这两行:
anon是anonymous的简写,表示未登陆用户有只读权限;auth是authorization之类的简写,表示授权用户的权限,可写。
修改,注意要顶格,使得未登陆可写:
6,继续提交
回到第4步,我们继续提交:D:\test\client\oa>svn commit -m "My first commit" helloSVN.txt
可以了哦;注意这个版本1不是指上传的文件的版本,而是指整个版本库的版本。
7,进行更新
采用如下命令即可:svn update 如果后面没有参数,就是更新整个版本库,有参数就是更新某个文件咯。