??SVN是Subversion的简称是一个自由开源嘚版本控制系统。
??Subversion将文件存放在中心版本库里这个版本库很像一个普通的文件服务器,不同的是它可以记录每一次文件和目录的修改情况,这样就可以借此将数据恢复到以前的版本并可以查看数据的更改细节。
??问题: 怎样让系统允许用户共享信息而不会让他們因意外而互相干扰?
??复制-修改-合并方案(Subversion默认的模式):在这种模型里每一个客户读取项目配置库建立一个私有工作副本——版本库Φ文件和目录的本地映射。用户并行工作修改各自的工作副本,最终各个私有的复制合并在一起,成为最终的版本这种系统通常可鉯辅助合并操作,但是最终要靠人工去确定正误
??锁定-修改-最常用的100种解锁图案方案:在这样的模型里,在一个时间段里配置库的一個文件只允许被一个人修改 此模式不适合软件开发这种工作。
??svn服务器有2种运行方式:独立服务器和借助apache运行两种方式各有利弊,鼡户可以自行选择
??svn存储版本数据也有2种方式:BDB一种事务安全型表类型和FSFS一种不需要数据库的存储系统。
??因为BDB方式在服务器中断時有可能锁住数据,所以还是FSFS方式更安全一点
??SVN是一种集中式管理代码的版本控制系统,原理就是把代码都保存到一个固定的位置(仓库)每次从这个位置拷贝更新代码,进行编辑;再把修改后的代码提交到该目录中多人协作开发也是如此。因此需要一个类似Oracle或鍺Mysql的服务器用于保存和管理库文件(要保存的代码等文件)的服务端——VisualSVN
Server还需要一个用户的操作端,用于提交更新检出代码常用的有idea嘚Svn插件,以及TortoiseSVN(小乌龟)
??安装完即可在服务中看到,启动服务即可
??直接双击下一步,走到这一步要注意command line client tools默认是不安装,要妀为安装否则IDEA配置不了。
??安装完重启电脑否则有些东西没生效。
??随便打开一个文件夹鼠标在空白处右键即可看到SVN Chexkout...
和TortoiseSVN
选项。
??使用的逻辑是SVN分为服务端和客户端,服务端存放代码进行版本控制,客户端是用户写代码使用的
??右键选择Repositories,选择Create New Repository选择FSFS类型,输入名称选择Empty repository,然后一直下一步即可创建一个空白仓库目录,用于存放代码比如我创建一个仓库叫做ssm:
??其实这里的ssm就相当於一个文件夹。
??客户端连接服务端来拉取代码连接至少需要提供两个信息:账号密码+仓库地址。因此要给每个程序员创建角色比洳我这里创建两个角色aaa、bbb和ccc,密码都是admin:
??创建好Users后我们观察到下边还有一个Groups,这是组用于权限控制的时候选择,我们把aaa和bbb用户设置为一组给起个名字”ssm开发组“,表明ssm仓库的代码是这个小组来写的
??权限控制指的是给仓库添加权限,运行哪些用户访问运行哪些操作等。
??刚才创建ssm仓库时其中一个步骤就是选择权限,当时没有创建用户就默认所有用户都可访问修改。现在要把ssm仓库改成呮有ssm项目组才能访问右键选择ssm仓库,选择Properties设置成如下:
??一般情况下,服务端是安装在远程服务器我们程序员都是使用TortoiseSVN来连接服務器端对代码进行版本控制。
??假设公司现在要做一个ssm项目公司有一个专门管理仓库的管理员已经把空白项目仓库ssm创建好了,公司有彡个程序员分别是小A、小B和小C,领导决定让小A和小B来做这个项目仓库管理员给他们两个分配的仓库账号aaa和bbb。由小A来主导项目
??仓庫管理员要把仓库的URL发给了小A和小B,于是管理员右键ssm仓库选择Copy URL to Cliboard,然后粘贴发给小A和小B
??现在小A安装好了客户端TorroiseSVN,开始做这个ssm项目了首先他要把自己本地和远程仓库进行关联,新建一个空白文件夹右键选择TortoiseSVN,选择Rep-browser把管理员给的仓库URL输入,弹出窗口让小A输入账号密碼小A输入属于他的账号密码:aaa/admin
??输入后,小A可以连接远程仓库了此时还没有和ssm仓库有关联,只是登陆了而已
??这个选项是把仓庫下载到本地,Finished后可以看到在文件夹中只有一个.svn文件夹这时因为项目还没开始,仓库是空的这个.svn目录表明这个文件夹被svn客户端管理了(不代表这个文件夹下所有文件都给SVN客户端管理了)。
??鼠标右键当前文件夹对比不在当前文件夹鼠标右键,发现鼠标右键的菜单选項不一样了也可以看到小A程序员建立的名字叫做“小A”的文件夹图标也变化了。
??进入到“小A”文件夹小A程序员开始写代码了,创建一个HelloWorld.java文件然后什么都不写:
??选择这个文件,右键TortoiseSVN选择Add,可以看到文件图标发生变化.表明这样图标的文件由SVN客户端管理了
??尛A表示,我要休息了于是右键空白处,会发现多了一个SVN Commit选项选择:
??选择OK后,就把这个代码提交到远程仓库了:
??这时仓库管悝员就可以看到ssm仓库有东西了,不是空白了可以跟老板汇报程序员开始干活了。
??本章的演示都是在一个计算机上实际是服务器、程序员A和程序员B三方都是在各自的电脑上的。所以为了让小A程序员去休息让小B程序员开始干活,先把小A程序员的登陆信息给清空
??現在小B程序员登场了,还是熟悉的操作小B程序员新建一个叫做“小B”的空白文件夹,跟上面小A程序员一样的操作连接仓库地址+登陆。
??小B程序员连接ssm仓库时还能看到小A程序员的commit记录
??登陆后,还是右键空白处选择SVN Checkout:
??这里要注意,小B下载的是版本1
??跟小A程序员不同的地方在于,小B程序员下载的仓库不是空的因为小A程序员提交过嘛。
??搞了那么久到底update是干嘛的?其实update的作用是更新操莋假设小B下载了这个项目是版本1,然后小B出去玩了一天回来才开始干活而这期间,很可能小A程序员又改了什么东西又提交了一次,導致远程仓库已经是版本2了那么小B程序员还在版本1上修改,就不对了因此,为了保证小B程序员修改的是在最新版本的基础上于是,祐键空白处可以看到一个update选择后:
??小B程序员一看,耶还是版本1,说明小A没有再次提交过可以放心写代码了。
??小B程序员最好茬开始写之前进行一次update以保证自己开始写的地方是最新版本。
??这时发现这时发现文件图案出现感叹号暂时不理他,直接commit此时远程仓库的ssm变成版本2了。
??小A程序员又开始干活了此时他本地因为已经有了ssm项目,就不用再下载只需要update一下就可以更新到最新版本了。
??可以看出现在小A修改的是版本2,于是小A开始修改这个HelloWorld.java:
??此时小A程序员开始思考下一句代码要写什么并没有commit代码,远程仓库朂新版本还是版本2
??这时,小B程序员上线了他也熟练地update一下,因为远程仓库自从版本2以来还没更新过所以小B程序员也是版本2基础仩开始工作。
??小B程序员也开始修改代码:
??然后小B程序员提交了代码:
??此时远程仓库的版本变成了版本3。
??话分两头小A程序员这边可就麻烦了。
??小A程序员冥思苦想还是不知道下一句要写什么,于是先提交了等下次有灵感了才继续写。这时问题来了小A修改的版本是基于版本2的,但这时的远程仓库已经是版本3了所以小A执行commit操作时,出现以下情况:
??怎么办小A程序员只能update了,update之後多产生了几个文件:
??HelloWorld.java:远程仓库版本3和本地文件的合并;
??HelloWorld.java.mine:小A程序员基于版本2修改后的文件(即刚才准备提交的文件);
??小A程序员于是就根据第一个远程仓库版本3和本地文件的合并来编辑冲突,右键选择HelloWorld.java选择TortoiseSVN,选择Edit conflicts:
??可以看出冲突就在于第三行,尛B程序员定义了一个变量小A程序员为了不改小B定义的变量,决定兼容合并右键选择冲突行,选择Use text block from ‘mine’ befor ‘theirs’修改成如下:
??然后执荇commit:
??可见,此时远程仓库已经更新到版本4了
??小A程序员突然灵光一闪,不行我得回到版本2,我在版本2的基础上修改完忘记测试叻现在版本4出现问题了。于是小A程序员右键选择TortoiseSVN选择Show log:
??可以看到,ssm项目的提交历史
??右键选择版本2,选择如下:
??于是乎小A程序员的本地版本变为版本2了:
??没错,小A开始重新修改了
??老板听说了小A和小B这样瞎折腾,对这个HelloWorld.java不抱希望了命令小A删除咜,重新写
??小A程序员update后,首先标记delete操作右键选择该文件,选择TortoiseSVN选择Delete。此时该文件已经在本地文件夹消失了但是这个操作没有影响到远程仓库,小A程序员再commit一次远程仓库就删除这个文件了。
??此时远程仓库变成了版本5版本5是没有HelloWorld.java这个文件的。
??这样就集成好了。
??现在我本地已经写好了一个完整的ssm项目准备放到远程ssm仓库。
??远程仓库新建一个其中一步选择以下:
??生成结果洳下,其实就算多了三个空文件夹
??第二步:导入远程仓库ssm的地址
??第三步:选择share
??第四步:选择版本,选1.8即可
??第五步:为叻完成share操作进行一次commit
??第六步:点add即可
??这时候远程仓库变成了这个样子:
??在visualSVN中创建仓库时,可以选择svn目录结构:
??Trunk :主干目录此目录下的文件为基准文件
??Branches:用于开发的分支目录
??Tags:用于发布的版本目录
??假设有一个项目ssm,我们完成了1.0版本这时就鈳以打一个tags。
??后续我们在ssm项目上添加一个新的模块(比如:通讯),我们就可以开一个分支,又有一个公司需要在我们ssm基础上添加财务管理模塊我们又可以打一个分支。
??我们后续针对ssm的1.0版本在升级我们不需要原来附加功能,就可以在原来的主干上继续开发,形成ssm 2.0版本开發完成后就可以在打一个tags。
??版本号定义为三段数字编号 xxx.xxx.xxx
????第一个:革命性的产品升级版
????第二个:新功能版
????第三个:修正bug
??假设我根据需求,添加了一个test类
??现在要把整个项目打成一个分支:
??说清楚从哪来到哪去。
??点击OK后远程仓库即鈳多一个分支
??Tags一般是只读,它代表的是发布的版本所以我们不要进行改变。