SVN学习
SVN学习
现实中开发软件时可能会遇到的问题:
代码管理混乱
备份多个版本,占用磁盘空间大
解决代码冲突困难
容易引发BUG
难于追溯问题代码的修改人和修改时间
难于恢复至以前正确版本
无法进行权限控制
项目版本发布困难
发展过程:
CVSàSVN,做不到分布式管理,相当于一个服务器,有网才行
微软的vss
现在常用的github,它与svn功能相似,针对开源项目管理代码应用较多,可以分布式管理。可以离线可以在线,只要给一个github地址就可以上传了。
版本迭代开发
在原版本的基础上开发,如果发现原版本的系统有bug,怎么办呢?
1、仓库
创建仓库:利用svnadmin create 命令创建。
上面的命令指的是在指定的目录下创建一个仓库。
仓库中都有些什么呢?
Conf:是配置文件的位置
Db:存放数据的。
hooks:里面是一系列的脚本(也叫钩子)。Svn可以编辑脚本。
locks:对文件上锁。
2、启动仓库的两种方式
- 命令启动:svnserve –d –r 文件路径
1.1 检查仓库是否启动:netstat –an
上面的这个命令可以检查端口号,一般svn默认的端口号是3690.
说明该端口号正在被监听
但是:
当把命令窗口关闭以后,监听就没有了,所以这种启动方式必须把命令窗口打开。
因此常用第二种启动方式。
2. Windows服务启动
2.1 创建启动服务
执行启动命令:
sc create SVN-Service binpath= "D:\SVNInstall\bin\svnserve.exe --service -r D:\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 删除服务
执行命令:sc delete SVN-Service
3、 Svn命令
仓库一般放在服务器中,因此不能直接从命令行操作仓库;而是使用客户端对仓库的内容进行操作。
3.1 svn checkout 命令
把仓库中的某一个项目checkout出来。
svn checkout svn://localhost/itcast F:\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.5 commit命令
说明:当把一个文件加入到指定仓库以后,接下来的操作就是提交。在提交的时候必须写一些说明(可以写这次提交都做了一些什么内容)
这是没有说时的提交状态,会报错,提示要使用说明:使用说明的好处是,如果一个时间范围内提交了多个文件,不知道现在提交的是什么 了,因此需要写下提交信息。
这里还是现实认证失败。
为什么会认证失败呢?
因为这里是不允许匿名用户登录的。
所以需要允许匿名用户登录
这个错误是刚才的修改的参数前面有一个空格,导致不能连接到库。
修改以后再提交:
再使用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。需要找这个错误。
- 因为是仓库的文件格式,所以到仓库中去找
- 找仓库的数据,即db文件夹
- 其中有个format文件
- 把其中的6改成1~4之间的数值就可以了
4.3 利用add把指定文件添加到版本控制
1. 先在user3的仓库中新建一个文件aa.txt
2. 然后commit
然后会出现如下对话框,在commit时需要说明
但是报错了,说认证失败
因为匿名登录文件没有更改
更改以后。。
3.然后再user4中checkout
4.更改user4中的aa.txt文件
5.user4中commit该文件
6.在user3中update该文件
5、权限问题
权限不管在哪都有这两个问题
认证 authentication:用户登录系统
授权 authorization:某一个用户针对某种资源的一个授权
5.1 Svnserve.conf文件
定义所有认证和授权政策
Svn中权限的设置在conf文件夹下的svnserve.conf文件中
在哪进行认证
在哪进行授权
5.1.1 anon-access
匿名用户的访问权限,应该是什么访问权限都没有
anon-access = none
5.1.2 auth-access
认证用户授权
auth-access=write
5.1.3 password-db
指定用户的认证文件为passwd文件
password-db=passwd
5.1.4 authz-db
authz-db=authz
指定用户的授权文件为authz。
5.2 passwd文件
存放项目成员账户信息
[users]
# harry = harryssecret
# sally = sallyssecret
等号左边代表用户名,等号右边代表密码,所以可以这么添加:
user1=user1pwd
user2=user2pwd
这样系统中有两个用户user1,user2,密码分别是user1pwd,user2pwd。
添加用户名和密码:
5.3 authz文件
复杂的群主授权控制
[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]:指出针对哪个仓库
# @harry_and_sally = rw:针对某一个仓库,对组进行授权
# * = r:对除了这个组以外的其他用户进行授权
[itcast:/]:针对itcast仓库
@svn_group = rw 针对svn_group组进行授权
user2 = rw 针对user2用户进行授权
* = 除了以上用户以外的其他用户都不能授权
[itcast:/doc]
user1 = rw
* =
以上配置说明:针对itcast仓库的doc目录,只有user1有读写权利,其他的用户都没有。
修改了这些以后,再对user3中的aa.txt文件进行更新,commit,会出现下面的对话框
这里需要填写用户名和密码了,因为刚才已经将匿名用户权限设置了。
然后在user4中进行更新,输入user4的用户名和密码
6、 上锁
可以针对user1用户中的aa.txt文件进行上锁的操作。
当输入用户名和密码的时候,就上锁了,上锁的突变如下所示:
当用户user2试图再次修改此文件时,会报如下的错误:
6.1 解锁
6.2 needs-lock
将aa.txt文件变成needs-lock
添加一个属性:svn:need-lock,值为true,确定以后变成如下的图标:
这个图标表明再次修改必须上锁。
6.2.1 当一个文件needs-lock以后,就不能再进行上锁,修改,和commit操作了;必须要得到锁才能进行这些操作。
6.2.2 去除needs-lock属性
点击remove就可以了
7、 冲突问题
1. 在文件夹中新建一个仓库,创建成仓库。并对仓库中的配置文件进行配置
2. 在中新建两个用户和,在user1中checkout,将仓库下载到user1中,再新建一个文件,并对a.txt进行编辑,然后add,再commit。
3. 在中checkout,将文件下载到中,并进行修改,然后commit。
4. 在中对进行修改,然后commit,就会引起冲突,如下
这是因为在中对进行修改之前没有update,两个用户都对文件进行了修改和提交,但是没有进行更新,所以引起文件冲突。
5. 当选择update文件时,出现以下几个文件
6. 然后选择冲突的文件
Theirs表示服务器上的
Mine 表示自己的
Merged 表示合并以后的版本
然后选择resolve就解决了冲突
最后commit就可以了。
8、SVN嵌入到myeclipse
8.1 下载插件
从官网上下载插件http://subclipse.tigris.org,可以从这个网站下载到最新的svn插件。
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文件进行编辑
4 commit
5 compare with
可以利用Compare with的功能的子功能
基本修订版
最新版本的上一个版本
6 replesase with
可以选择某一个版本的内容覆盖当前版本的内容
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的项目check out到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、 版本的对比,合并版本
**************************************************特此说明************************************************
本篇文章为本人的学习积累,主要用来个人复习及与爱好编程的朋友共享,如有侵权请联系删除!