现实中开发软件时可能会遇到的问题:
代码管理混乱
备份多个版本,占用磁盘空间大
解决代码冲突困难
容易引发BUG
难于恢复至以前正确版本
无法进行权限控制
项目版本发布困难
发展过程:
CVSàSVN,做不到分布式管理,相当于一个服务器,有网才行
微软的vss
现在常用的github,它与svn功能相似,针对开源项目管理代码应用较多,可以分布式管理。可以离线可以在线,只要给一个github地址就可以上传了。
版本迭代开发
在原版本的基础上开发,如果发现原版本的系统有bug,怎么办呢?
1、仓库
创建仓库:利用svnadmincreate命令创建。
上面的命令指的是在指定的目录下创建一个仓库。
仓库中都有些什么呢?
Conf:是配置文件的位置
Db:存放数据的。
hooks:里面是一系列的脚本(也叫钩子)。Svn可以编辑脚本。
locks:对文件上锁。
2、启动仓库的两种方式
1.1检查仓库是否启动:netstat–an
上面的这个命令可以检查端口号,一般svn默认的端口号是3690.
说明该端口号正在被监听
但是:
当把命令窗口关闭以后,监听就没有了,所以这种启动方式必须把命令窗口打开。
因此常用第二种启动方式。
2.Windows服务启动
2.1创建启动服务
执行启动命令:
sccreateSVN-Servicebinpath="D:\SVNInstall\bin\svnserve.exe--service-rD:\svnWorkSpace\repository"displayname="SVN-Service"start=“auto”depend=“Tcpip”
binpath为执行命令所在的路径
-r为仓库的路径:这里配置的多仓库,只查询到仓库存放的地址。
也就是说可以在svn下建立很多仓库,例如建立itcast仓库
访问的时候:svn://localhost/itcast。建立oa,则访问的时候
svn://localhost/oa
如果路径改为D:\svnWorkSpace\repository\041701,只能访问041701这一个仓库。
各选项代表的意义:
创建成功以后,会在系统的服务中产生一个service
这里是没有启动的,需要手动的点击启动。
2.2删除服务
执行命令:scdeleteSVN-Service
3、Svn命令
仓库一般放在服务器中,因此不能直接从命令行操作仓库;而是使用客户端对仓库的内容进行操作。
3.1svncheckout命令
把仓库中的某一个项目checkout出来。
svncheckoutsvn://localhost/itcastF:\develop\workroom\user
3.2建立用户
创建一个客户端操作文件夹
F:\work\course\svn\develop
在该文件夹下建立两个文件夹,分别代表用户user1和user2
Develop是相当于开发者
User1、user2是模拟两个开发者
3.3模拟用户操作仓库
使用checkout命令把itheima18仓库checkout到user1目录下
操作后
注意:这种文件有时候会被隐藏起来,因此要显示隐藏的文件夹才可以看见。从文件的属性中可以看到当前文件夹中有几个文件。
这里会默认根据库名寻找到本地的库。
3.4使用add命令
说明:把a.txt加入到了itcast仓库,加入到了版本控制中
3.5commit命令
说明:当把一个文件加入到指定仓库以后,接下来的操作就是提交。在提交的时候必须写一些说明(可以写这次提交都做了一些什么内容)
这里还是现实认证失败。
为什么会认证失败呢?
这个错误是刚才的修改的参数前面有一个空格,导致不能连接到库。
修改以后再提交:
再使用svn中checkout命令将库拷贝到user2中:
结果:
这就把库中修改后的文件拷贝下来了。
然后再修改再使用add命令和commit命令上传到库中,别人在使用checkout拷贝下来的。
这个过程的步骤:
主要用到的就是checkout、commit、update这三个命令
但是用命令太费劲了,实际应用时是用图形化界面来做的。实际在使用图形化界面做相应操作时,其底层就是用的这些命令来完成的。
4、Tortoisesvn的使用
这是svn的客户端也分为32bit和64bit。需要安装在电脑上。
怎么测试安装成功了呢?
当对着一个文件夹右键时出现下图:
这就是svn的客户端安装成功了
4.1新建一个库
右键单击需要被设置成库的文件夹:
4.2建立用户
先建立两个文件夹user3和user4
然后打开user3文件夹,右键单击
然后。。
在这里有时候会出现如下错误(尤其是64bit的)
分析:
期望文件格式是1~4之间的,但是现有格式是6。需要找这个错误。
4.3利用add把指定文件添加到版本控制
1.先在user3的仓库中新建一个文件aa.txt
2.然后commit
然后会出现如下对话框,在commit时需要说明
但是报错了,说认证失败
更改以后。。
3.然后再user4中checkout
4.更改user4中的aa.txt文件
5.user4中commit该文件
6.在user3中update该文件
5、权限问题
权限不管在哪都有这两个问题
5.1Svnserve.conf文件
Svn中权限的设置在conf文件夹下的svnserve.conf文件中
在哪进行认证
5.1.1anon-access
匿名用户的访问权限,应该是什么访问权限都没有
anon-access=none
5.1.2auth-access
auth-access=write
5.1.3password-db
指定用户的认证文件为passwd文件
password-db=passwd
5.1.4authz-db
authz-db=authz
5.2passwd文件
存放项目成员账户信息
[users]
#harry=harryssecret
#sally=sallyssecret
等号左边代表用户名,等号右边代表密码,所以可以这么添加:
user1=user1pwd
user2=user2pwd
这样系统中有两个用户user1,user2,密码分别是user1pwd,user2pwd。
添加用户名和密码:
5.3authz文件
[groups]
#harry_and_sally=harry,sally
#harry_sally_and_joe=harry,sally,&joe
groups是组的意思
等号左边的是组名,等号右边的是组的成员
所以可以写
svn_group=user1把user1加入到svn_group组中
#[repository:/baz/fuz]
#@harry_and_sally=rw
#*=r
#[repository:/baz/fuz]:指出针对哪个仓库
[itcast:/]:针对itcast仓库
[itcast:/doc]
user1=rw
*=
以上配置说明:针对itcast仓库的doc目录,只有user1有读写权利,其他的用户都没有。
修改了这些以后,再对user3中的aa.txt文件进行更新,commit,会出现下面的对话框
这里需要填写用户名和密码了,因为刚才已经将匿名用户权限设置了。
然后在user4中进行更新,输入user4的用户名和密码
6、上锁
可以针对user1用户中的aa.txt文件进行上锁的操作。
当输入用户名和密码的时候,就上锁了,上锁的突变如下所示:
当用户user2试图再次修改此文件时,会报如下的错误:
6.1解锁
6.2needs-lock
将aa.txt文件变成needs-lock
添加一个属性:svn:need-lock,值为true,确定以后变成如下的图标:
这个图标表明再次修改必须上锁。
6.2.1当一个文件needs-lock以后,就不能再进行上锁,修改,和commit操作了;必须要得到锁才能进行这些操作。
6.2.2去除needs-lock属性
点击remove就可以了
7、冲突问题
5.当选择update文件时,出现以下几个文件
6.然后选择冲突的文件
Theirs表示服务器上的
Mine表示自己的
Merged表示合并以后的版本
然后选择resolve就解决了冲突
最后commit就可以了。
8、SVN嵌入到myeclipse
8.1下载插件
8.2创建插件目录
在F:\work\course\svn下创建插件目录myplugins\svn\eclipse,把下载完的解压后的两个文件夹放入到该目录下
8.3创建SVN.link文件
在myeclipse安装的dropins目录下创建svn.link文件
Link文件中的path
path的值就是svn插件的目录所在。
8.4重启myeclipse
9、SVN在myeclipse中的使用
1.把库添加到myeclipse中
打开如下的视图:
准备新建一个资源库的位置
输入库的url:
2把SVN的项目检出到myeclipse中
在新建项目的时候,选择从svn上检出项目
选择现有资源库的位置
检出的项目在myeclipse中
3对a.txt文件进行编辑
4commit
5comparewith
可以利用Comparewith的功能的子功能
基本修订版
最新版本的上一个版本
6replesasewith
可以选择某一个版本的内容覆盖当前版本的内容
7把项目添加到SVN中
新建一个项目,做如下操作:
选择svn
把项目保存在itcast资源库
9.2分支、可并、切换
1、Trunk:开发主线
存放开发的主线,团队成员在开发的时候一直要用这个库中的内容
2、Branches:存放修复版本
存放支线副本:当项目稳定以后,先发布到tags下,如果发现了bug,再从tags下检出到branches下。在该版本下进行bug的修复,把修复完毕的稳定的版本重新发布到tags下。
3、Tags:存放稳定版本
存放标签副本,也就是存放稳定版本
9.3开发需求
一个公司开发了一个oa系统,随后发布了一个版本v1.0,由于这个版本还是比较成功的,然后客户提出了更多的需求,随后开发团地准备开发下一个版本v2.0,当开发团队
在如火如荼的工作的时候,客户突然提出了在v1.0版本有一个bug,需要改进,而且必须把这个改进引入到v2.0版本中。用svn怎么样解决这个问题呢?
9.3.1解决问题
1、在svn库中建立一个项目oa
2、让oa成为svn项目
3、修改权限,让匿名用户具有写的权限
4、在客户端准备一个oa文件夹
5、在oa文件夹下建立三个文件夹
6、把oa里面的内容导入到svn库中
7、查看仓库的结构
从上面可以看出,branches,tags,trunk已经被加入到仓库中了。
8、把正在开发的一个项目导入到trunk(主线)中
这样该项目的基本代码就加入到了trunk中。
9、把trunk的项目checkout到myeclipse中。
10、发布v1.0版本
选择发布到tags目录
在tags下建立一个文件夹V1.0
11、开发V2.0版本
在A.java类上稍微做一下修改即可。
12、现在V1.0有bug,对V1.0的版本做出检出
13、对V1.0的版本进行修改
14、对修改后的内容进行提交
15、以上操作不对,因为tags的内容不能进行修改
16、
17、对tags中的V1.0做分支
对tags中的V1.0做分支,然后移动到branches中,为V1.0_fixup。
18、切换版本库的路径
把路径切换到branches/V1.0_fixup。
19、提交
因为版本库已经切换到了branches/V1.0_fixup,所以这个时候可以提交了。
20、把修复好的V1.0_fixup发布
选择branches中的版本做分支标记。
发布到稳定库中(tags),并且版本的名字为V1.1
21、把V1.1版本加入到原来的版本中
在trunk版本中,选择合并。
从tags/V1.1中进行merge
22、在企业的应用
项目经理会发一个word文档
1、svn的仓库的地址
2、使用svn的用户名和密码
3、把svn上的项目导入到myelicpse中
4、做自己的模块,把自己写的东西上传到svn上
5、版本的对比,合并版本
**************************************************特此说明************************************************